1、LINQ介绍
LINQ(Language Integrated Query,语言集成查询),是c#编程语言中的一种查询语法。有了LINQ,使得以相同的语法访问不同的数据源成为可能。这是因为,LINQ提供了不同数据源的抽象层。
2、LINQ查询基础
本节介绍了一个简单的LINQ查询。在此基础上,着重理解:c#提供了转换为方法调用的集成查询语言。
2.1、准备列表和实体
接下来的几个章节的LINQ查询是在一个锦标赛的集合上进行的。这个集合需要用到.NET的类库:
System
System.Collection.Generic
2.2、Racer类型。
Racer定义了几个属性和一个重载的ToString()方法,该方法以字符串格式显示赛车手。实现了IFormattable接口,以支持字符串的不同变体;还实现了IComparable<Racer>接口,它根据Lastname为一组赛车手排序。为了演示更高级的查询,Racer类还定义了多值属性,如Cars和Years。Years属性列出了赛车手获得冠军的年份(车手可以多次获得冠军)。Cars属性列出了赛车手在获得冠军的年份中使用的所有车型:
1 //这是一个赛车手 2 public class Racer:IComparable<Racer>,IFormattable 3 { 4 public string FirstName { get; } 5 public string LastName { get; } 6 public string Country { get; } 7 public int Starts { get; } 8 public int Wins { get; } 9 public object Years { get; } //包含车手获得冠军的年份(可以多次获得冠军) 10 public object Cars { get; } //车手获得冠军年份中使用的车型。参加不同比赛,使用的车型可能不一样 11 12 public Racer(string firstName,string lastName,string country,int starts,int wins) 13 :this(firstName,lastName,country,starts,wins,null,null){ } 14 15 public Racer(string firstName, string lastName, string country, int starts, int wins, IEnumerable<int> years, IEnumerable<string> cars) 16 { 17 FirstName = firstName; 18 LastName = lastName; 19 Country = country; 20 Starts = starts; 21 Wins = wins; 22 Years = years; 23 Cars = cars; 24 } 25 public override string ToString() => $"{FirstName} {LastName}"; 26 27 int IComparable<Racer>.CompareTo(Racer other) => FirstName.CompareTo(other?.FirstName); 28 29 public string ToString(string format) => ToString(format, null); 30 31 public string ToString(string format, IFormatProvider formatProvider) 32 { 33 switch (format) 34 { 35 case null: 36 case "N": 37 return ToString(); 38 case "F": 39 return FirstName; 40 case "L": 41 return LastName; 42 case "C": 43 return Country; 44 case "S": 45 return Starts.ToString(); 46 case "W": 47 return Wins.ToString(); 48 case "A": 49 return $"姓名:{FirstName} {LastName},国家:{Country}; 开始:{Starts}; 获胜次数:{Wins}"; 50 default: 51 throw new FormatException($"不支持格式:{format}"); 52 } 53 } 54 }