學習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方法區別。
這是我學到的一些東西,希望和大家分享,若是有問題,還請博友多多指正。