請注意,根據IQueryable<T>
的工作原理,所有這些都是非常有教育意義的猜測。
將它分解爲三個部分:
Expression<Func<T, bool>> query = null
這是一個where子句,它是一個的傳遞給Where
擴展方法上IQueryable<T>
相同的簽名。
你會傳遞一個表達式,這個表達式在代碼中用一個lambda表達式來表示; C#編譯器知道該參數正在查找Expression
,並將其編譯到表達式樹中而不是委託。
例如,假設T
是Person
類的int
財產Age
,你可以過濾掉的IQueryable<Person>
是30歲或以上的返回的任何Person
如下:
p => p.Age > 30
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy
這只是一個代表,如果提供,將允許您設置訂單。假設您想要按年齡排序的Person
情況下,你會使用:
q => q.OrderBy(p => p.Age)
這是因爲返回類型爲IOrderedQueryable<T>
,其擴展方法,如ThenBy
和ThenByDescending
如何彈出你打電話OrderBy
和OrderByDescending
後才;這些擴展方法僅在IOrderedQueryable<T>
上定義(它只是一個標記界面)。
includeProperties
這給遠,它的使用實體框架的覆蓋之下。當您在Entity Framework中調用Include
時,它允許您(通過外鍵)獲取相關實體並加載與查詢中返回的實體相關的實體。
假設Person
班有一個屬性Father
類型Person
。如果您想查詢Person
實例並返回Father
屬性,那麼您應該撥打Include("Father")
來指示實體框架不僅應獲取Person
的實例,還應該解析Father
關係。
IEnumerable<T>
返回類型
這是返回,這樣你就不能訪問了IQueryable<T>
實例,並迫使你兌現的結果集(如您遍歷它)。
,這是否應該將返回一個物化列表(IReadOnlyCollection<T>
)的實現,或東西,不只是(assumedly)的IQueryable<T>
強制轉換爲IEnumerable<T>
。
這也表明該方法的作者對客戶的信任;因爲IQueryable<T>
沒有被返回,它表明它不信任客戶端不進行低效的數據庫調用(這是一個有效的擔憂)。
我喜歡你用「天書」 - 表達式可以顯得凌亂 –
你需要一點更具體的瞭解其對韓國人的部分是gobbledy。你知道泛型是什麼嗎?你知道代表是什麼嗎?你對'IQueryable'的工作原理感到困惑嗎?你不明白'Expression <>'位?有一個很好的答案已經打破這種特定的方法,但也許這些條款將有助於指導您的基礎研究。 –
我聽說過泛型和代表。我從來沒有見過與術語IQueryable,Func或Expression <>有關的任何內容。我所聽過的唯一'表達'是指數學(如2 + 2)。我假設,雖然有一個特定的背景下,這些事情一起發生。這就是我想要弄明白的。 – rayden54