以下两个陈述是否相同?
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 :(得分: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
方法过滤结果,然后抓取第一条记录。第二个查询使用两个方法调用,而第一个只使用一个。