2011-08-18 61 views
1

這兩個模塊是否完全一樣?一個人比另一個人有什麼優勢嗎?LINQ vs context.entity.Where()

 using (var context = new TRANSITEntities()) 
     { 
      var result = context.Table1.Where(c => c.UserCode == "123"); 
     } 


     using (var context = new TRANSITEntities()) 
     { 
      var result = from c in context.Table1 
         where c.UserCode == "123" 
         select c; 
     } 

回答

4

完全一樣。

您可以通過查看的ToString()

string query1String, query2String; 
    using (var context = new TRANSITEntities()) 
    { 
     var result = context.Table1.Where(c => c.UserCode == "123"); 
     query1String = result.Expression.ToString(); 
    } 


    using (var context = new TRANSITEntities()) 
    { 
     var result = from c in context.Table1 
        where c.UserCode == "123" 
        select c; 
     var query2String = result.Expression.ToString(); 
    } 

    Assert.AreEqual(query1String, query2String); 

還應當指出的是,result實際上不是一個結果驗證這一點你自己。這是一個未執行/列舉的IQueryable。這意味着它就像一個尚未運行的SQL語句(有點)。如果你要這樣做

var t1 = result.ToArray() 
    var t2 = result.ToArray() 

然後查詢將被實際執行兩次。 t1t2是REAL結果(在存儲器陣列中)...而不是result。換句話說,result實際上應該被命名爲query而且,上面的示例永遠不會工作......因爲如果您對using塊以外的結果調用ToArray,它將失敗...因爲您無法運行一旦上下文處理後查詢:

using (var context = new TRANSITEntities()) 
    { 
     var result = context.Table1.Where(c => c.UserCode == "123"); 
    } 
    // throws exception: 
    var array = result.ToArray(); 
3

井從context.Table1第一選擇,從context.LINTE第二選擇。所以他們從完全不同的集合中選擇。

而且在用戶代碼列,在CodeUsager列第二,第一選擇..

除了(是第一次只是一個第二的翻譯和你忘了第二翻譯)代碼是一樣的。 C#編譯器只會將第二個查詢轉換爲第一個查詢,並且它們的行爲將完全相同。

+0

是的,我的錯誤。我試圖讓它可讀。失敗。 – Mathieu

+0

已修復。成功! –

2

它們完全一樣。在解析任何方法之前,編譯器將查詢語法轉換爲lambda表達式版本。

1

如果您嘗試從不同的表中進行選擇,那麼它是不同的。

但是,如果表格是相同的,那麼它只是表示不同。

沒有什麼區別,它只是你喜歡哪種編碼方式。

在創建sql表示之前,所有linq查詢都轉換爲Lambda。

1

從朱莉婭Lermans的書編程實體框架:

MSDN文檔說,「一般情況下,我們建議的查詢語法 ,因爲它通常是更簡單,更可讀;然而,在方法語法和查詢語法之間沒有 語義差異。「* 因此,使用一種方法是一種風格和個人 的選擇。