IEnumerable和IQueryable之我觀

2021-05-25 02:45:12 字數 1551 閱讀 1249

在弄明白ienumerable和這兩個東西之前,首先我們要清楚「linq 查詢操作中的型別關係」 問題。引用msdn的文字:

不轉換源資料的查詢

下圖演示不對資料執行轉換的 linq to objects 查詢操作。

源包含乙個字串序列,查詢輸出也是乙個字串序列。

資料來源的型別引數決定範圍變數的型別。

選擇的物件的型別決定查詢變數的型別。

此處的 name 為乙個字串。

因此,查詢變數是乙個ienumerable

在 foreach 語句中迴圈訪問查詢變數。

因為查詢變數是乙個字串序列,所以迭代變數也是乙個字串。

2。轉換源資料的查詢

下圖演示對資料執行簡單轉換的 linq to sql 查詢操作。

查詢將乙個 customer 物件序列用作輸入,並只選擇結果中的 name 屬性。

因為 name 是乙個字串,所以查詢生成乙個字串序列作為輸出。

不轉換資料型別,是屬於對本地資料來源進行的linq操作,它返回的是 ienumerable

;另外兩種,是屬於對遠端資料來源進行linq操作,它返回的就是iqueryable。

總結:對於在記憶體中集合上執行的方法(即擴充套件

ienumerable

的那些方法),返回的可列舉物件將捕獲傳遞到方法的引數。在列舉該物件時,將使用查詢運算子的邏輯,並返回查詢結果。

資料來源的型別引數決定範圍變數的型別。

select 語句返回 name 屬性,而非完整的 customer 物件。

因為 name 是乙個字串,所以 custnamequery 的型別引數是 string,而非 customer。

因為 custnamequery 是乙個字串序列,所以 foreach 迴圈的迭代變數也必須是 string。

下圖演示稍微複雜的轉換。

select 語句返回只捕獲原始 customer 物件的兩個成員的匿名型別。

資料來源的型別引數始終為查詢中的範圍變數的型別。

因為 select 語句生成匿名型別,所以必須使用 var 隱式型別化查詢變數。

因為查詢變數的型別是隱式的,所以 foreach 迴圈中的迭代變數也必須是隱式的。

讓編譯器推斷型別資訊

雖然您應該了解查詢操作中的型別關係,但是您也可以選擇讓編譯器為您執行全部工作。

關鍵字 var

可用於查詢操作中的任何區域性變數。

下圖與前面討論的第二個示例完全等效。

唯一的區別是編譯器將為查詢操作中的各個變數提供強型別:

IEnumerable和IQueryable之我觀

在弄明白ienumerable和這兩個東西之前,首先我們要清楚 linq 查詢操作中的型別關係 問題。引用msdn的文字 不轉換源資料的查詢 下圖演示不對資料執行轉換的 linq to objects 查詢操作。源包含乙個字串序列,查詢輸出也是乙個字串序列。資料來源的型別引數決定範圍變數的型別。選擇...

IEnumerable和IQueryable的區別

ienumerable介面 公開列舉器,該列舉器支援在指定型別的集合上進行簡單迭代。也就是說 實現了此介面的object,就可以直接使用foreach遍歷此object iqueryable 介面 它繼承 ienumerable 介面,而因為.net版本加入linq和 iqueryable後,使得i...

IEnumerable和IQueryable的區別

ienumerable介面 公開列舉器,該列舉器支援在指定型別的集合上進行簡單迭代。也就是說 實現了此介面的object,就可以直接使用foreach遍歷此object iqueryable 介面 它繼承 ienumerable 介面,而因為.net版本加入linq和 iqueryable後,使得i...