23.C#Queryable的擴充方法(十二章12.1-12.2)

來源:互聯網
上載者:User

標籤:

  今天要寫的知識還真心有點繞呢,對於第一節的內容,其實是把原先在記憶體中的資料來源,換成了從資料庫中提取出來的資料。從代碼的使用方式上是一樣的,直接跳過,來看看IEnumerable和IQueryable的區別。

  正如Enumerable類型包含著關於IEnumerable<T>的擴充方法來實現LINQ標準查詢操作符一樣,Queryabl類型包含著關於IQueryable<T>的擴充方法。IEnumerable<T>和IQueryable<T>有兩個重要的區別。

  首先IEnumerable<T>的方法都使用委託作為參數,例如,Select方法使用Func<TSource,TResult>。這對於記憶體中的操作是沒有問題的,但對於別處執行查詢的LINQ提供器來說,我們需要能執行更詳細檢查的格式--運算式樹狀架構。例如,Queryable中相應的Select的重載就要擷取類型為Expression<Func<TSource,TResult>>的參數。編譯器根本不會關心這些--在查詢編譯之後,它具有一個需要作為參數傳遞給方法的Lambda運算式,而Lambda運算式即可以被轉換成委託執行個體,也可以轉換成運算式樹狀架構。中的表示,會根據資料來源選擇相應的重載。

  選擇兩種路徑的查詢,具體使用哪個路徑取決於資料來源實現的是IQueryable介面還是IEnumerable介面。

  當我們將Lambda運算式傳入作為參數時,Lambda運算式即可以轉換成委託執行個體,也可以轉換成運算式樹狀架構執行個體,左邊的路徑用於執行記憶體中的操作,而右邊路徑用於來在資料庫中執行SQL。

  Queryable和Enumerable之間的第2個重大差別,Enumerable的擴充方法會完成與對應查詢操作符相關的實際工作(至少會構建完成這些工作的迭代器)。例如,Eumerable.Where中的代碼執行相關的過濾操作,並在結果序列中產生適當的元素。通過比較,Queryable中的查詢操作符的"實現"做的事情非常少。

  •  IQueryable<T>和相關介面的介紹

  IQueryable<T>是從IEnumerable<T>和非泛型的IQueryable繼承而來,而IQueryable又繼承於非泛型IEnumerable,IQueryable僅有三個屬性:QueryProvider、ElementType和Expression。理解IQueryable的最簡單方式就是,把它看作一個查詢,在執行的時候,將會產生結果序列。從LINQ的角度來看,由於是通過IQueryable的Expression屬性返回結果,所以查詢的詳細資料就儲存於運算式樹狀架構中。

  請大家給出深入見解,學習一二,斧正。

23.C#Queryable的擴充方法(十二章12.1-12.2)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.