关于Linq中Lambda的一些基础性问题

学习Linq也有些时间了,开始时不是很习惯,越用越发现它的便捷。最近看了和使用了一段时间Lambda表达式,发现这也的确是个好东西。
当我们通过Linq查询或者其他方式产生了一个IQueryable<T>对象时,比如是在我们从产品表中查询产品的列表
IQueryable<Product> product = from p in db.Products select p;

如果我们想从这个product列表中取出ProductID为5的一项,我们当然可以用for或者foreach进行遍历比较,也可以再写个Linq语句进行下查询,这几个方法都完全可以取到指定的ProductID的Product。

for方法

 
      Product proOne;
for (int i = 0; i < product.Count(); i++)
{
if (product.ToList().ElementAt(i).ProductID== 5)
{
proOne = product.ToList().ElementAt(i);
}
}

 foreach方法和for方法类似,不再赘述,

Linq查询: 

proOne = (from p in product where p.ProductID== 5 select p).ToList().ElementAt(0);

以上方法是不是用点麻烦,并且将Linq延迟查询的优点抹去了,那么来看看Lambda表达式方法:

proOne = product.Single(p => p.ProductID== 5);

只需短短的几个字就完成了上面几个方法中繁琐的步骤,且很好的保留了Linq延迟查询的优点。这样写程序是不是感觉很爽呢?
体会到了Lambda表达式的优点,下面再来看看Lambda表达式其他的一些用法,介绍两种最常用的吧,Where和Select
首先是Select方法:

var proIDList = product.Select(p => p.ProductID > 5);


可以发现Select方法和Single方法里面的语句类似,其实他们返回的对象是不同的,Single方法是取出列表中的一个对象。Select方法是取出 列表中符合条件的多个对象的 某个字段的值 的列表。
在这条语句中Select方法返回的就是个 IEnumerable<int>对象,而Single返回的是一个Product对象,下面的Where方法返回的则是IEnumerable<Product>一个对象列表:

var proList = product.Where(p => p.ProductID > 5);

Where产生的是一列Product对象,要注意和Select方法区别。

这是我学到的一些东西,希望和大家分享,若是有问题,还请博友多多指正。

原文地址:https://www.cnblogs.com/shiyue/p/2006621.html