L2E这两个是一回事吗?

时间:2010-04-15 19:45:22

标签: c# linq entity-framework linq-to-entities

以下两个陈述是否相同?

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();

1 个答案:

答案 0 :(得分: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();
    }
}

使用Reflector我能够看到实际编译的代码:

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方法过滤结果,然后抓取第一条记录。第二个查询使用两个方法调用,而第一个只使用一个。