2012-05-14 158 views
0

這是一本使用northwind數據庫的書籍。什麼是=>是什麼意思?簡單的LINQ查詢=>

Northwind db = new Northwind(@"Data Source=.\SQLEXPRESS;InitialCatalog=Northwind"); 
    var orders = db.Customers 
    .Where(c => c.Country == "USA" && c.Region == "WA") 
    .SelectMany(c => c.Orders); 
    Console.WriteLine(orders.GetType()); 

他們爲什麼不只是寫

Where(c.Country == "USA" && c.Regian == "WA") 
+1

你試過'LINQ'教程嗎?谷歌的'lambda表達式'。 – gdoron

回答

3

Where()需求括號內的部分是一個功能,需要一個Customer並返回一個bool EAN值(這是Func<Customer, bool>在C#的類型系統)。

使用C#的Lambda Expressions編寫該函數是最常見的。

c =>部分是指「採取在傳遞給你的Customer並與c該值稱之爲c,然後計算該條件。如果沒有對=>的左側c,編譯器就沒有辦法。的知道什麼c

+0

這是有道理的,除了返回一個布爾部分,我明白所有它,如果我運行一個foreach循環,並且將每個客戶都返回到bool返回的地方? –

+0

哦,我想我知道了,如果滿足2條件c.Country和c.Region,它會返回true,那麼客戶被添加? –

+0

@ScottSelby,是的 - 完全正確。 – sblom

1

這是一個lambda表達式它描述了一個功能;變量箭頭左邊是參數的功能,在這種情況下,該函數有一個參數,所以。箭頭左側的單個變量。

考慮你給出的「他們爲什麼不......」的例子。 c在哪裏申報?編譯器如何知道它代表什麼?

您可能想知道編譯器如何知道c參數的類型,它顯然是這樣做的,因爲它允許您調用CountryRegion屬性。這是通過類型推斷完成的。 Where方法需要一個委託參數,其參數的類型取決於序列的類型(在本例中爲Customers)。

由於CustomersIEnumerable<Customer>,編譯器期望的委託與單個Customer參數,因此它把lambda表達式作爲Customer變量的單個參數。

1

如果他們寫了這個:

Where(c.Country == "USA" && c.Regian == "WA") 

在哪裏,你會定義什麼變量c簡稱?如果一個地方早在我的代碼我寫了什麼:

var c = "this is a string"; 

這種符號定義了拉姆達結構,其中c =>勢必由Where函數預期的輸入代理 - 在這種情況下,c勢必每一行,並且您使用c運行的功能需要返回一個布爾值。

注意,你可以寫這樣的函數:

public bool OnlyWA(Row c) 
{ 
    return c.Country == "USA" && c.Regian == "WA"; 
} 

然後用它是這樣的:

var orders = db.Customers 
       .Where(OnlyWA) 
       .SelectMany(c => c.Orders); 

在這裏,因爲你是你不需要的c不再使用命名函數而不是lambda變量。該函數的唯一參數代替c。對於小函數來說,這通常是過度的,並且當小謂詞函數從其使用(因此是上下文)位置移開時,這進一步使得難以閱讀。

0

=>是拉姆達操作者 在這裏看到:msdn

它在lambda表達式用來將輸入變量的左側從拉姆達體右側分離。 Lambda表達式的內聯表達式類似於匿名方法,但更加靈活;它們廣泛用於以方法語法表示的LINQ查詢。