繁体   English   中英

LINQ中两个“where”之间的区别

[英]Difference between two “where”s in LINQ

请告诉我(1)中“where”和(2)中“where()”之间的区别。

何时使用“where”和“where()”?

List<Person> pList = 
new List<Person>
  {  
       new Person
             {EmpNo=1,FirstName="Marc",LastName="Loel",Salary=3434},

       new Person
             {EmpNo=2, FirstName="Steve",LastName="Kaith",Salary=4545},       

       new Person 
             {EmpNo=3,FirstName="Neol",LastName="Henk",Salary=2222},          

   };

 (1) var v = from p in pList where p.EmpNo == 1 select new { p.FirstName };

 (2)  var query =pList .Where(p => p.EmpNo == 1)
                               .Select(p => new { p.FirstName});

不同之处在于,一种形式更易于阅读,另一种形式更难以阅读。 麻烦的是,大约一半的人认为第一个更容易,一半的人认为第二个更容易! 选择你最喜欢的那个并坚持下去; 他们的意思完全相同。

没有真正的区别。 第一个where(和select)是一个特殊的语言内查询表达式,由编译器转换为其他基于lambda的Where和Select方法。

这只是语法糖。 实际上,如果你只有一个具有正确Where方法的类,即使该类不可枚举,你也可以使用语法魔法:

class MyClass
{
    public IQueryable<int> Where(Func<int, bool> predicate)
    {
        return Enumerable.Range(1, 100).AsQueryable();
    }
}

static void Main(string[] args)
{
    var q = from p in new MyClass()
            where p == 10
            select p;      
}

这没有做任何事情,但它构建并将调用该方法。

没有区别。 数字(1)只是用一些语法糖写的。

快速查看反射器中的代码,它看起来像这样:

var v = pList.Where<Person>(delegate (Person p) {
    return (p.EmpNo == 1);
}).Select(delegate (Person p) {
    return new { FirstName = p.FirstName };
});
var query = pList.Where<Person>(delegate (Person p) {
    return (p.EmpNo == 1);
}).Select(delegate (Person p) {
    return new { FirstName = p.FirstName };
});

如您所见,它们完全相同。

我相信他们是完全相同的。 为了便于阅读,Microsoft在(1)中创建了语法,但编译器将其处理为(2)。

差异(如果你想挑剔)是第一个是LINQ,第二个不是。

LINQ是您在第一个示例中看到的集成查询语言,编译器将其转换为使用第二个示例中所示的扩展方法。

in.where()方法还有一些额外的功能,例如你可以使用where方法的索引扩展。

但是对于给定的例子,它只是可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM