C#3.0新增功能09 LINQ 基礎06 LINQ 查詢操作中的類型關係
- 2019 年 10 月 4 日
- 筆記
若要有效編寫查詢,應了解完整的查詢操作中的變數類型是如何全部彼此關聯的。 如果了解這些關係,就能夠更容易地理解文檔中的 LINQ 示例和程式碼示例。 另外,還能了解在使用 var
隱式對變數進行類型化時的後台操作。
LINQ 查詢操作在數據源、查詢本身及查詢執行中是強類型化的。 查詢中變數的類型必須與數據源中元素的類型和 foreach
語句中迭代變數的類型兼容。 此強類型保證在編譯時捕獲類型錯誤,以便可以在用戶遇到這些錯誤之前更正它們。
為了演示這些類型關係,下面的大多數示例對所有變數使用顯式類型。 最後一個示例演示在利用使用 var 的隱式類型時,如何應用相同的原則。
不轉換源數據的查詢
下圖演示不對數據執行轉換的 LINQ to Objects 查詢操作。 源包含一個字元串序列,查詢輸出也是一個字元串序列。

- 數據源的類型參數決定範圍變數的類型。
- 所選對象的類型決定查詢變數的類型。 此處的
name
是一個字元串。 因此,查詢變數是一個IEnumerable<string>
。 - 在
foreach
語句中循環訪問查詢變數。 因為查詢變數是一個字元串序列,所以迭代變數也是一個字元串。
轉換源數據的查詢
下圖演示對數據執行簡單轉換的 LINQ to SQL 查詢操作。 查詢將一個 Customer
對象序列用作輸入,並只選擇結果中的 Name
屬性。 因為 Name
是一個字元串,所以查詢生成一個字元串序列作為輸出。

- 數據源的類型參數決定範圍變數的類型。
-
select
語句返回Name
屬性,而非完整的Customer
對象。 因為Name
是一個字元串,所以custNameQuery
的類型參數是string
,而非Customer
。 - 因為
custNameQuery
是一個字元串序列,所以foreach
循環的迭代變數也必須是string
。
下圖演示稍微複雜的轉換。 select
語句返回只捕獲原始 Customer
對象的兩個成員的匿名類型。

- 數據源的類型參數始終為查詢中範圍變數的類型。
- 因為
select
語句生成匿名類型,所以必須使用var
隱式類型化查詢變數。 - 因為查詢變數的類型是隱式的,所以
foreach
循環中的迭代變數也必須是隱式的。
讓編譯器推斷類型資訊
雖然需要了解查詢操作中的類型關係,但是也可以選擇讓編譯器執行全部工作。 關鍵字 var可用於查詢操作中的任何本地變數。 下圖與前面討論的第二個示例相似。 但是,編譯器為查詢操作中的各個變數提供強類型。