好的,這是我的發現經過Reflector輸出一段時間後。 LINQ到對象使用WhereArrayIterator
或WhereListIterator
當它導致幾乎表現得像& &運營商結合起來,連續where
謂詞,但不能作爲確切:
當您使用x.a==1 && x.b==1
where子句轉化爲Func<TSource, bool>
看起來像這樣:
bool daspredicate(TSource x)
{
return x.a==1 && x.b==1
}
但是,當您使用連續的Where子句時,會有輕微的性能損失,至少源於非JITted IL-方面。下面是組合後代碼的樣子:
bool predicate1(TSource x)
{
return x.a==1;
}
bool predicate2(TSource x)
{
return x.b==1;
}
bool daspredicate(TSource x)
{
return predicate1(x) && predicate2(x);
}
正如您所看到的,這涉及到額外的函數調用開銷。除非JIT內聯函數,否則這可能相當昂貴。我相信它在這方面做得很好,但我們現在知道,如果我們自己結合我們的Where語句,JIT的工作變得更加容易,除非必要。
儘管在SQL的一面,查詢是相同的。即使在執行之前,調試器也會將查詢對象評估爲相同的SQL語句。 Linq名稱空間中我不能太過分,因爲事情似乎更復雜,但由於查詢是相同的,所以不應該像上面的LINQ到對象示例那樣受到懲罰。
編輯:我見過多個where語句導致SQL服務器上的嵌套子查詢的實例。我認爲,只要能夠保證安全,就堅持單個地方發言是更好的辦法。
幾乎重複http://stackoverflow.com/questions/1648730/when-using-linq-what-is-the-difference-between-and-multiple-where-clauses – 2009-11-04 11:27:20
我沒有發現在我的搜索,但無論如何,這是LINQ到SQL的具體情況。 – 2009-11-04 11:34:23
對LINQ到對象的影響將是顯而易見的,但LINQ到SQL尚不清楚。 – 2009-11-04 11:35:14