2015-06-14 11 views
5

我正在閱讀通用庫。我一直陷入一些我不明白的代碼中。我不知道他們是否有特定的名字。這是什麼叫做,它有什麼作用? (作爲通用庫的一部分)

這是最複雜的例子我見過:

IEnumerable<T> GetByQuery(
    Expression<Func<T, bool>> query = null, 
    Func<IQueryable<T>, IOrderedQueryable<T>> orderby = null, 
    string includeProperties = ""); 

我知道它(不管它是什麼)顯然返回IEnumerable,但我不知道如何讀官樣文章的那些亂七八糟更不用說如何去使用它。

編輯:我更感興趣的是知道這個例子比這個具體的例子細分。在我能找到解釋語法的東西之前,我需要知道它們的名稱。 LINQ?

編輯2:我在問一個比被回答的問題簡單得多的問題。我只想知道的是「爲什麼要使用搜索條件以研究上述代碼?」

+0

我喜歡你用「天書」 - 表達式可以顯得凌亂 –

+0

你需要一點更具體的瞭解其對韓國人的部分是gobbledy。你知道泛型是什麼嗎?你知道代表是什麼嗎?你對'IQueryable '的工作原理感到困惑嗎?你不明白'Expression <>'位?有一個很好的答案已經打破這種特定的方法,但也許這些條款將有助於指導您的基礎研究。 –

+0

我聽說過泛型和代表。我從來沒有見過與術語IQueryable,Func或Expression <>有關的任何內容。我所聽過的唯一'表達'是指數學(如2 + 2)。我假設,雖然有一個特定的背景下,這些事情一起發生。這就是我想要弄明白的。 – rayden54

回答

9

請注意,根據IQueryable<T>的工作原理,所有這些都是非常有教育意義的猜測。

將它分解爲三個部分:

Expression<Func<T, bool>> query = null 

這是一個where子句,它是一個的傳遞給Where擴展方法上IQueryable<T>相同的簽名。

你會傳遞一個表達式,這個表達式在代碼中用一個lambda表達式來表示; C#編譯器知道該參數正在查找Expression,並將其編譯到表達式樹中而不是委託。

例如,假設TPerson類的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>,其擴展方法,如ThenByThenByDescending如何彈出你打電話OrderByOrderByDescending後才;這些擴展方法僅在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>沒有被返回,它表明它不信任客戶端不進行低效的數據庫調用(這是一個有效的擔憂)。

+3

我應該注意到,我認爲這種方法肯定是一種障礙;它真的使得使用Entity Framework變得更加困難。 您應做的是有機會獲得一個IQueryable的''(基本的過濾器/排序的一些設置),並讓來電者兌現名單本身,可選擇在這樣做之前附加一些額外的查詢邏輯/操作。 – casperOne

+0

我不知道那是什麼,恐怕。 – rayden54

+2

@ user2146821如果你不明白這個答案,這個答案很清楚,很好的分解,你還有一些基礎研究要做。 – usr

相關問題