2010-04-15 136 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方法来筛选结果,然后抓取第一条记录。第二个查询使用两个方法调用,而第一个只使用一个。