2010-04-15 120 views
0

以下兩種說法是否相同?L2E這兩個是相同的東西?

Users user = db.Users.First(u => (u.Username == username)); 

var user = from u in db.Users 
      where u.Username == username 
      select u; 
Users aUser = user.First(); 
+0

請注意,沒有一個可能是正確的。我想你真的想'u.Username.Equals(username,StringComparison.OrdinalIgnoreCase)' – 2010-04-16 16:49:02

回答

3

是,無論這些查詢的是在功能上是相同的。由於LINQ語言關鍵字只是C#的語言擴展,因此編譯器會將第二個查詢翻譯爲第一個查詢。

下面是一個類似的例子,顯示這是真的:

using System; 
using System.Linq; 

class Example 
{ 
    static void Main() 
    { 
     var names = new[] { "Andrew", "Nicole", "Michael", 
      "Joe", "Sammy", "Joshua" }; 

     var shortNames = from n in names 
       where n.Length == 6 
       select n; 
     var first = names.First(); 
    } 
} 

使用反射器,我能夠看到實際的編譯代碼:

internal class Example 
{ 
    private static void Main() 
    { 
     string[] names = new string[] { "Andrew", "Nicole", "Michael", "Joe", "Sammy", "Joshua" }; 
     IEnumerable<string> shortNames = names.Where<string>(delegate (string n) { 
      return n.Length == 6; 
     }); 
     string first = names.First<string>(); 
    } 
} 

正如你所看到的,查詢語法我輸入的內容已被編譯器更改爲調用Enumerable類的擴展方法。 LINQ查詢關鍵字對於編譯器轉換爲方法調用的開發人員來說只是一種方便。

編輯:我沒有注意到你的兩個查詢之間的一個區別,我沒有注意到乍一看。由於它將謂詞傳遞給First方法,因此您的第一個查詢將稍微更快地執行。這會更快,因爲您的第二個查詢首先使用Where方法來篩選結果,然後抓取第一條記錄。第二個查詢使用兩個方法調用,而第一個只使用一個。