2009-10-15 137 views
2

请让我知道(1)中的“where”和(2)中的“where()”之间的区别。LINQ中两个“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}); 

回答

1

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

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

+8

我不同意,第二种方法是LINQ查询,只是没有理解语法。 – 2009-10-16 06:26:43

+0

为什么downvote?如果你没有说出你不喜欢的是什么,那是毫无意义的。 – Guffa 2010-02-01 18:43:52

6

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

2

没有区别。数字(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 }; 
}); 

正如你可以看到,他们是完全一样的。

2

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

5

这只是语法糖。事实上,如果你只是有正确的一类方法在哪里,即使类是不可枚举,你可以使用语法魔法:

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;  
} 

这并不做任何事情,但它建立和意志调用该方法。

+0

这是一个巧妙的把戏。我想这是额外的LINQ提供程序如何创建的? – StriplingWarrior 2009-10-15 18:28:37

+0

就是这样做的。有一个在微软工作的人拥有第9频道的视频,并使用这种技术来向辛普森展示Linq。有趣的东西:)他目前正在从事Linq to Powershell的工作。如果我找到该视频,我会更新一个链接。 – BFree 2009-10-15 19:01:43

25

区别在于一个表单更易于阅读,另一个表单更难阅读。麻烦的是,大约一半的人认为第一个更容易,一半的人认为第二个更容易!选择一个你最喜欢的,并坚持下去;他们的意思完全一样。

+2

大声笑。机智+1。 – StriplingWarrior 2009-10-15 18:29:58

+4

好的,还有10种类型的人 – bniwredyc 2009-10-15 18:35:37

-1

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

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