比如说我们要从用户表customer和用户订单表orders中,查询上海的用户,在最近10个月中至少消费3笔满10快钱的用户的姓名和年龄。如果写成传统的方法,不知道要写多少代码,而且各种复杂的处理逻辑使得代码的语义非常不清晰,但是,如果写成LINQ的话,会是如下:
var results = from customer in customers where customer.State == "WA" let custOrders = (from order in orders where customer.ID == order.ID select new { order.Date, order.Amount }) where custOrders.Count(co => co.Amount >= 10 && co.Date >= DateTime.Now.AddMonths(−10)) >= 3 select new { customer.Name, customer.Age }; foreach (var result in results) { Console.WriteLine("{0} {1}", result.Name, result.Age);
let子句可以引入一个变量,并对该变量赋值
Linq对以前集合的支持
大多数Linq标准查询操作符只能对实现了IEnumerable<T>接口的集合进行调用,对于以前C#集合位于System.Collection命名空间的没有实现IEnumerable<T>的集合,可以通过Cast和OfType操作符进行转义操作,如:
ArrayList alist=new ArrayList()
alist.add("Adams"); alist.add("Arthur"); alist.add("Buchanan")
IEnumerable<string> names=alist.Cast<string>().where(n=>n.Length<7);
IEnumerable<string> names=alist.OfType<string>().where(n=>n.Length<7);
上述两个结果相同,区别是Cast操作符将把集合中的每个元素转换为将要放到输出序列中的指定类型,如果集合中有一个数据类型不能被转换为指定的类型,刚将会产生一个异常,而OfType操作符将只把可以被转换为指定类型的那些元素放到输出序列中,所以应优先使用OfType
对象初始化操作
Address address=new Address{
address="105 Elm Street",
city="Atlanta",
state="GA",
postalCode='30339"};
扩展方法: 当我们需要对已有类的功能进行扩展时,我们通常会想到继承,继承已有类,然后加入新的行为,C#3.0中加入扩展方法的概念,我们可以在不使用继承的前提下对已有类的功能进行扩展,这种方法不会产生新的类型,而是采用向已有类中加入新方法的方式来完成功能扩展
注意:扩展方法的类要是Static,方法要是Static,在第一个参数前要有一个this
public static int Extensions(this string s,int x,string y)
Linq的延时加载
int[] intArray=new int[]{1,2,3};
List<int> ints=intArray.Select(i=>i);
foreach(int i in ints)
Console.writeLine(i)
intArray[0]=5
foreach(inti in ints)
Console.writeLine(i)
两者结果不相同,前一个是1,2,3,后一个是5,2,3
List<int> ints=intAraray.Select(i=>i).ToList()
如果采用ToList()后,两者结果相同,都是1,2,3
原因:第一种操作查询没有真正的执行,只是操作被延时了,如果不希望查询被延时,可以使用一个不返回IEnumerable<T>数据类型的转换符,如ToList,ToArray,ToDictionary,ToLookUp,First,Last,Single,ElementAt,Contains,Count,Sum,Min,Max,Average等计算这些操作符会创建一个不同的数据结构来缓存返回结果,这样,即使数据源改变了,这些缓存的结果也不会发生改变,所以后面的调用了ToList()操作符的结果没有发生改变
采用复合From子句筛选出所有架驶法拉利的冠军车手 (C#高级编程)
var ferrarDivers=from r in alist
from c in alist.Cars()
where c="Ferrari"
order by r.LastName Select r.FirstName+" "+r.LastName;
其中aList表示所有冠军车手的一个集合