2009-10-15 121 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方法的索引擴展。

但是對於給定的例子它只是可讀性。