2010-06-15 54 views
6

我剛開始使用EF和類似以下的查詢令我奇怪:「it.Name」實體框架查詢生成器方法:爲什麼「它」而不是lambdas?

var departmentQuery = 
       schoolContext.Departments.Include("Courses"). 
       OrderBy("it.Name"); 

具體來說,什麼伸出我是當我使用LINQ to SQL進行工具化時,查詢生成器查詢中的每個篩選器幾乎都可以用lambda指定,例如,在這種情況下,d => d.Name。

我看到有OrderBy的重寫需要使用返回IOrderedQueryable或IOrderedEnumable的lambdas,但是那些顯然沒有獲取ObjectResult所需的Execute方法可能會被數據綁定。

對於我來說,畢竟我已經閱讀了關於lambda如何爲這種東西做出如此重要的意義,以及如何將它們翻譯成表達式樹,然後轉換爲目標語言,這似乎很奇怪 - 爲什麼我需要使用「 it.Name「?

+0

另一個例子是.Where(「it.SomeProperty is not null」)。現在我已經看到了在本機C#中表現的標準查詢運算符的奇怪混雜,以及完全位於TSQL-land中的顯式過濾器。我認爲EF的目的就是擺脫這一點。 – nlawalker 2010-06-15 22:26:01

回答

2

我得到lamdba表達式與我的;我可以做Where(it.SomeProperty == 1)...你有System.Linq作爲命名空間嗎?從d在schoolContext.Departments.Include( 「課程」)

VAR departmentQuery =排序依據d.Name 選擇d;:您可以嘗試以結構調整

這些是一些可能性。

HTH。

+0

有趣。我發現你是對的,它仍然有效 - 我只需要將我的GridView的DataSource設置爲departmentQuery而不是departmentQuery.Execute(MergeOptions.Whatever),因爲它現在是IQueryable或IOrderedQueryable,而不是ObjectQuery,因此它沒有Execute方法。既然如此,似乎我錯過了設置MergeOption。我假設它只是在這種情況下使用默認值? – nlawalker 2010-06-16 00:29:05

+0

即使使用IQueryable,你也應該可以使用lambdas;只要它的通用形式,否則你需要在集合上調用Cast ()來獲得它的泛型類型。這可能會使用LINQ來代替L2E對象。 FYI是IQueryable的接口,也是由ObjectQuery實現的。 – 2010-06-16 01:10:33

+0

我在說的是在Where或OrderBy之類的東西中使用lambda會返回一個IQueryable *,而不是ObjectQuery。嘗試調用ObjectSet或ObjectQuery上的Where,然後查看Intellisense的重載 - 返回一個IQueryable並使用Func <>返回一個IEnumerable的結果。獲得ObjectQuery的唯一方法是調用需要的重載(string,params ObjectParameter [])。所有這一切說,我現在看到你可以轉換回ObjectQuery並重新獲得Execute()的訪問權限。標記爲有用聊天的答案,thx。 – nlawalker 2010-06-16 01:18:23