第11章Language Integrated Query.docx
- 文档编号:2535785
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:52
- 大小:35.45KB
第11章Language Integrated Query.docx
《第11章Language Integrated Query.docx》由会员分享,可在线阅读,更多相关《第11章Language Integrated Query.docx(52页珍藏版)》请在冰点文库上搜索。
第11章LanguageIntegratedQuery
第11章LanguageIntegratedQuery
LanguageIntegratedQuery(LINQ)是C#3.0和.NET3.5中最重要的新功能。
LINQ集成了C#编程语言中的查询语法,可以用相同的语法访问不同的数据源。
LINQ提供了不同数据源的抽象层,所以可以使用相同的语法。
本章介绍LINQ的核心功能和C#3.0中支持新特性的语言扩展。
本章的主要内容如下:
● 用List
● 扩展方法
● λ表达式
● LINQ查询
● 标准查询操作符
● 表达式树
● LINQ提供程序
提示:
本章介绍LINQ的核心功能。
读完本章后,在数据库中使用LINQ的内容可查阅第27章,查询XML数据的内容可参见第29章。
11.1 LINQ概述
在介绍LINQ的特性之前,本节先用一个例子来说明在LINQ推出之前如何查询对象。
在此过程中,将说明查询如何演变为LINQ查询。
了解了这些步骤,就知道LINQ查询的意义了。
本章的示例基于一级方程式世界冠军。
查询将搜索一个Racer对象列表。
第一个查询按照比赛的顺序得到巴西所有一级方程式世界冠军。
11.1.1 使用List
过滤和排序的第一个变体是在一个List
在搜索开始之前,必须确定对象类型和对象列表。
给对象定义类型Racer。
Racer定义了几个属性和一个重载的ToString()方法,该方法以字符串格式显示赛手。
这个类实现了接口IFormattable,以支持格式字符串的不同变体,这个类还实现了接口IComparable
为了执行更高级的查询,类Racer不仅包含单值属性,如Firstname、Lastname、Wins、Country和Starts,还包含多值属性,如Cars和Years。
Years属性列出了赛手获得冠军的年份。
一些赛手曾多次获得冠军。
Cars属性用于列出赛手在获得冠军的年份中使用的所有车型。
usingSystem;
usingSystem.Text;
namespaceWrox.ProCSharp.LINQ
{
[Serializable]
publicclassRacer:
IComparable
{
publicstringFirstName{get;set;}
publicstringLastName{get;set;}
publicintWins{get;set;}
publicstringCountry{get;set;}
publicintStarts{get;set;}
publicstring[]Cars{get;set;}
publicint[]Years{get;set;}
publicoverridestringToString()
{
returnString.Format("{0}{1}",Firstname,Lastname);
}
publicintCompareTo(Racerother)
{
returnthis.lastname.CompareTo(other.lastname);
}
publicstringToString(stringformat)
{
returnToString(format,null);
}
publicstringToString(stringformat,IFormatProviderformatProvider)
{
switch(format)
{
casenull:
case"N":
returnToString();
case"F":
returnFirstname;
case"L":
returnLastname;
case"C":
returnCountry;
case"S":
returnStarts.ToString();
case"W":
returnWins.ToString();
case"A":
returnString.Format("{0}{1},{2};"+
"starts:
{3},wins:
{4}",
FirstName,LastName,Country,
Starts,Wins);
default:
thrownewFormatException(String.Format(
"Format{0}notsupported",format));
}
}
}
}
类Formula1在GetChampions()方法中返回一组赛手。
这个列表包含了1950到2007年之间的所有一级方程式冠军。
usingSystem;
usingSystem.Collections.Generic;
namespaceWrox.ProCSharp.LINQ
{
publicstaticclassFormula1
{
publicstaticIList
{
List
racers.Add(newRacer(){FirstName="Nino",
LastName="Farina",Country="Italy",
Starts=33,Wins=5,
Years=newint[]{1950},
Cars=newstring[]{"AlfaRomeo"}});
racers.Add(newRacer(){
FirstName="Alberto",
LastName="Ascari",Country="Italy",
Starts=32,Wins=10,
Years=newint[]{1952,1953},
Cars=newstring[]{"Ferrari"}});
racers.Add(newRacer(){
FirstName="JuanManuel",
LastName="Fangio",
Country="Argentina",Starts=51,
Wins=24,Years=newint[]
{1951,1954,1955,1956,1957},
Cars=newstring[]{"AlfaRomeo",
"Maserati","Mercedes",
"Ferrari"}});
racers.Add(newRacer(){FirstName="Mike",
LastName="Hawthorn",Country="UK",
Starts=45,Wins=3,
Years=newint[]{1958},
Cars=newstring[]{"Ferrari"}});
racers.Add(newRacer(){FirstName="Phil",
LastName="Hill",Country="USA",
Starts=48,Wins=3,
Years=newint[]{1961},
Cars=newstring[]{"Ferrari"}});
racers.Add(newRacer(){FirstName="John",
LastName="Surtees",Country="UK",
Starts=111,Wins=6,
Years=newint[]{1964},
Cars=newstring[]{"Ferrari"}});
racers.Add(newRacer(){FirstName="Jim",
LastName="Clark",Country="UK",
Starts=72,Wins=25,
Years=newint[]{1963,1965},
Cars=newstring[]{"Lotus"}});
racers.Add(newRacer(){FirstName="Jack",
LastName="Brabham",
Country="Australia",Starts=125,
Wins=14,
Years=newint[]{1959,1960,1966},
Cars=newstring[]{"Cooper",
"Brabham"}});
racers.Add(newRacer(){FirstName="Denny",
LastName="Hulme",
Country="NewZealand",Starts=112,
Wins=8,
Years=newint[]{1967},
Cars=newstring[]{"Brabham"}});
racers.Add(newRacer(){FirstName="Graham",
LastName="Hill",Country="UK",
Starts=176,Wins=14,
Years=newint[]{1962,1968},
Cars=newstring[]{"BRM","Lotus"}
});
racers.Add(newRacer(){FirstName="Jochen",
LastName="Rindt",Country="Austria",
Starts=60,Wins=6,
Years=newint[]{1970},
Cars=newstring[]{"Lotus"}});
racers.Add(newRacer(){FirstName="Jackie",
LastName="Stewart",Country="UK",
Starts=99,Wins=27,
Years=newint[]{1969,1971,1973},
Cars=newstring[]{"Matra",
"Tyrrell"}});
racers.Add(newRacer(){
FirstName="Emerson",
LastName="Fittipaldi",
Country="Brazil",Starts=143,
Wins=14,Years=newint[]{1972,
1974},
Cars=newstring[]{"Lotus",
"McLaren"}});
racers.Add(newRacer(){FirstName="James",
LastName="Hunt",Country="UK",
Starts=91,Wins=10,
Years=newint[]{1976},
Cars=newstring[]{"McLaren"}});
racers.Add(newRacer(){FirstName="Mario",
LastName="Andretti",Country="USA",
Starts=128,Wins=12,
Years=newint[]{1978},
Cars=newstring[]{"Lotus"}});
racers.Add(newRacer(){FirstName="Jody",
LastName="Scheckter",
Country="SouthAfrica",Starts=112,
Wins=10,
Years=newint[]{1979},
Cars=newstring[]{"Ferrari"}});
racers.Add(newRacer(){FirstName="Alan",
LastName="Jones",
Country="Australia",Starts=115,
Wins=12,
Years=newint[]{1980},
Cars=newstring[]{"Williams"}});
racers.Add(newRacer(){FirstName="Keke",
LastName="Rosberg",
Country="Finland",Starts=114,
Wins=5,
Years=newint[]{1982},
Cars=newstring[]{"Williams"}});
racers.Add(newRacer(){FirstName="Niki",
LastName="Lauda",Country="Austria",
Starts=173,Wins=25,
Years=newint[]{1975,1977,1984},
Cars=newstring[]{"Ferrari",
"McLaren"}});
racers.Add(newRacer(){FirstName="Nelson",
LastName="Piquet",Country="Brazil",
Starts=204,Wins=23,
Years=newint[]{1981,1983,1987},
Cars=newstring[]{"Brabham",
"Williams"}});
racers.Add(newRacer(){FirstName="Ayrton",
LastName="Senna",Country="Brazil",
Starts=161,Wins=41,
Years=newint[]{1988,1990,1991},
Cars=newstring[]{"McLaren"}});
racers.Add(newRacer(){FirstName="Nigel",
LastName="Mansell",Country="UK",
Starts=187,Wins=31,
Years=newint[]{1992},
Cars=newstring[]{"Williams"}});
racers.Add(newRacer(){FirstName="Alain",
LastName="Prost",Country="France",
Starts=197,Wins=51,
Years=newint[]{1985,1986,1989,
1993},
Cars=newstring[]{"McLaren",
"Williams"}});
racers.Add(newRacer(){FirstName="Damon",
LastName="Hill",Country="UK",
Starts=114,Wins=22,
Years=newint[]{1996},
Cars=newstring[]{"Williams"}});
racers.Add(newRacer(){
FirstName="Jacques",
LastName="Villeneuve",
Country="Canada",Starts=165,
Wins=11,Years=newint[]{1997},
Cars=newstring[]{"Williams"}});
racers.Add(newRacer(){FirstName="Mika",
LastName="Hakkinen",
Country="Finland",Starts=160,
Wins=20,Years=newint[]{1998,
1999},
Cars=newstring[]{"McLaren"}});
racers.Add(newRacer(){
FirstName="Michael",
LastName="Schumacher",
Country="Germany",Starts=250,
Wins=91,
Years=newint[]{1994,1995,2000,
2001,2002,2003,2004},
Cars=newstring[]{"Benetton",
"Ferrari"}});
racers.Add(newRacer(){
FirstName="Fernando",
LastName="Alonso",Country="Spain",
Starts=105,Wins=19,
Years=newint[]{2005,2006},
Cars=newstring[]{"Renault"}});
racers.Add(newRacer(){FirstName="Kimi",
LastName="R ikk nen",
Country="Finland",Starts=122,
Wins=15,Years=newint[]{2007},
Cars=newstring[]{"Ferrari"}});
returnracers;
}
}
}
对于后面在多个列表中执行的查询,GetConstructorChampions()方法返回所有的制造商冠军。
制造商冠军是从1958年开始设立的。
publicstaticIList
GetContructorChampions()
{
List
teams.Add(newTeam(){Name="Vanwall",
Years=newint[]{1958}});
teams.Add(newTeam(){Name="Cooper",
Years=newint[]{1959,1960}});
teams.Add(newTeam(){Name="Ferrari",
Years=newint[]{1961,1964,1975,
1976,1977,1979,1982,1983,1999,
2000,2001,2002,2003,2004,2007}});
teams.Add(newTeam(){Name="BRM",
Years=newint[]{1962}});
teams.Add(newTeam(){Name="Lotus",
Years=newint[]{1963,1965,1968,
1970,1972,1973,1978}});
teams.Add(newTeam(){Name="Brabham",
Years=newint[]{1966,1967}});
teams.Add(newTeam(){Name="Matra",
Years=newint[]{1969}});
teams.Add(newTeam(){Name="Tyrrell",
Years=newint[]{1971}});
teams.Add(newTeam(){Name="McLaren",
Years=newint[]{1974,1984,1985,
1988,1989,1990,1991,1998}});
teams.Add(newTeam(){Name="Williams",
Years=newint[]{1980,1981,1986,
1987,1992,1993,1994,1996,1997}});
teams.Add(newTeam(){Name="Benetton",
Years=newint[]{1995}});
teams.Add(newTeam(){Name="Renault",
Years=newint[]{2005,2006}});
returnteams;
}
现在进入对象查询的核心。
首先,需要用GetChampions()静态方法获得对象列表。
该列表放在泛型类List
这个类的FindAll()方法接收一个Predicate
只返回Country属性设置为Brazil的赛手。
接着,用Sort()方法给得到的列表排序。
不应按照Lastname属性排序,因为这是Racer类的默认排序方式,而可以传送一个类型为Comparison
使用r2对象,与r1比较,根据需要进行降序排序。
foreach语句最终迭代已排序的集合中的所有Racer对象。
privatestaticvoidObjectQuery()
{
List
List
delegate(Racerr)
{
returnr.Country=="Brazil";
});
brazilRacers.Sort(
delegate(Racerr1,Racerr2)
{
returnr2.Wins.CompareTo(r1.Wins);
});
foreach(RacerrinbrazilRacers)
{
Console.Wri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第11章 Language Integrated Query 11
![提示](https://static.bingdoc.com/images/bang_tan.gif)