2010-11-04 67 views
24

這兩種查詢上下文的方式有什麼區別嗎?實體框架。方法鏈接

Firm firm = base.context.Firms 
      .Where(f => f.SomeId == someId) 
      .Where(f => f.AnotherId == anotherId) 
      .FirstOrDefault(); 

Firm firm = base.context.Firms 
      .Where(f => f.SomeId == someId && f.AnotherId == anotherId) 
      .FirstOrDefault(); 

看來,鏈接完美地完成AND條件。我不相信你可以鏈接OR語句。是否有理由相對於另一個更好地選擇一個,或者當某個更好/更有效時的情景?

回答

34

他們都應該產生相同的最終結果(如果我沒有弄錯),但我發現第二個更具可讀性,更好地顯示原意。


更新

我只是驗證使用LINQPad上述聲明。事實上,這兩個查詢都會產生相同的SQL。

例如:

context.SomeTable.Where(c => c.ParentId == null) 
       .Where(c => c.Name.Contains("F")) 
       .Select(c => c.Name); 

產地:

SELECT [t0].[Name] 
FROM [SomeTable] AS [t0] 
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[ParentId] IS NULL) 

哪個是受產生的相同SQL:

context.SomeTable.Where(c => c.ParentId == null && c.Name.Contains("F")) 
       .Select(c => c.Name); 



你也可以小巧的東西多一點(我覺得最好的與上面相同的原因):

var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId 
                && f.AnotherId == anotherId); 
+1

+1可讀性 – TGnat 2010-11-04 16:05:37

+0

+1爲LinqPad。 – Omar 2010-11-04 16:41:56

+5

第一個對我來說是最易讀的。你可以立即看到有兩個單獨的條件必須匹配,並且它們完美地排列。當然,第二個也有兩個條件,但是需要額外的第二個解析條件中有一個&&。 – Ryan 2010-11-04 16:51:02

0

您可以通過代碼進行調試,並查看每個產生的SQL。我會想象它變成了相同的查詢。

2

我的猜測是,只要你是在IQueryable工作(如可能是您的上下文集合是),使用鏈式擴展與完整謂詞子句可以達到同樣的效果。這是因爲IQueryable允許延遲執行,所以在幕後生成基本相同的SQL。