2014-01-22 38 views
0
return db.Orders.Where(o => o.Customer == User.Identity.Name); 

o從何而來?有時我會看到這種形式與其他字母一起使用,如c? 這是可交換的嗎? User.Identity.Name從哪裏來?ASP.NET Entity Framework DB查詢語法

+0

這不是特定於實體。搜索Lambda表達式。這就是這個。但它基本上只是一個功能。 'o'是你傳遞給函數的東西。 –

+0

查看本[相關問題](http://math.stackexchange.com/q/646238)。 –

回答

1

這被稱爲Lambda Expression

通過使用lambda表達式,你可以寫,可以作爲參數傳遞或返回函數調用的價值本地函數。

在你的情況,你正在使用

db.Orders.Where(o => o.Customer == User.Identity.Name); 

在地方的o你可以使用任何你想要的字符和字符將被表現爲集合類型,即實例。這裏您使用的是Orders的集合,因此o將表現爲Order類的實例。

4

o從哪裏來?

Where需要一個Func委託,它接受您正在使用的任何集合類型的實例。在這種情況下,它將是Func<Order, bool>。您的Lambda語句聲明一個與委託相匹配的匿名函數。 o只是Order輸入。你可以隨便命名。如果您在長手寫出來的功能,它看起來是這樣的:

public bool AnonymousFunction(Order o) 
{ 
    return o.Customer == User.Identity.Name; 
} 

如果您使用LINQ到對象查詢,該委託將被調用每個元素的發現在的那些匹配的集合。如果您正在查詢LINQ to SQL(或其他查詢提供程序),則您的委託將被轉換爲表達式樹,該樹將用於生成實際的查詢語法。

User.Identity.Name從何而來?

我假設你在某種Web應用程序中,並且User.Identity正在從Forms Authentication令牌中提取已登錄的用戶信息。

2

=>運算符用於定義lambda表達式 - 本質上是內聯函數。這相當於內嵌的:

public bool Myfunc(Order o) 
{ 
    return o.Customer == User.Identity.Name; 
} 

類型o從傳遞到WhereFunc的參數類型推斷。在這種情況下,類型將爲Order,因爲IEnumerable<Order>.Where()需要Func<Order, bool>Order作爲輸入,bool作爲輸出。

實際的字母並不重要。一個很好的慣例是使用與源類型相關的標識符,因此oorder將是不錯的選擇。

User可能是該函數所在類的屬性(即Page),並且User.Identity.Name是與用戶關聯的標識的名稱。

0

所有提供的答案都是正確的。我只是試圖解釋你有關語句簡單的語言:通過寫db.Orders 然後你在使用Where

裏面Where您指定的表把一個條件

您正在訪問的Order表條件。這是使用lambda表達式完成的。 Lambda表達式只不過是一種說法,我將每行稱爲o(或者可以是任何東西,它可以是x,y,abc,任何東西,它只是一個名稱),並且爲此(=>)檢查if o.Customer等於當前登錄的用戶。

如果是,請將所有符合此條件的行返回給我。