C#3.0新增功能09 LINQ 基礎06 LINQ 查詢操作中的類型關係

  • 2019 年 10 月 4 日
  • 筆記

若要有效編寫查詢,應了解完整的查詢操作中的變數類型是如何全部彼此關聯的。 如果了解這些關係,就能夠更容易地理解文檔中的 LINQ 示例和程式碼示例。 另外,還能了解在使用 var 隱式對變數進行類型化時的後台操作。

LINQ 查詢操作在數據源、查詢本身及查詢執行中是強類型化的。 查詢中變數的類型必須與數據源中元素的類型和 foreach 語句中迭代變數的類型兼容。 此強類型保證在編譯時捕獲類型錯誤,以便可以在用戶遇到這些錯誤之前更正它們。

為了演示這些類型關係,下面的大多數示例對所有變數使用顯式類型。 最後一個示例演示在利用使用 var 的隱式類型時,如何應用相同的原則。

不轉換源數據的查詢

下圖演示不對數據執行轉換的 LINQ to Objects 查詢操作。 源包含一個字元串序列,查詢輸出也是一個字元串序列。

  1. 數據源的類型參數決定範圍變數的類型。
  2. 所選對象的類型決定查詢變數的類型。 此處的 name 是一個字元串。 因此,查詢變數是一個 IEnumerable<string>
  3. foreach 語句中循環訪問查詢變數。 因為查詢變數是一個字元串序列,所以迭代變數也是一個字元串。

轉換源數據的查詢

下圖演示對數據執行簡單轉換的 LINQ to SQL 查詢操作。 查詢將一個 Customer 對象序列用作輸入,並只選擇結果中的 Name 屬性。 因為 Name 是一個字元串,所以查詢生成一個字元串序列作為輸出。

  1. 數據源的類型參數決定範圍變數的類型。
  2. select 語句返回 Name 屬性,而非完整的 Customer 對象。 因為 Name 是一個字元串,所以 custNameQuery 的類型參數是 string,而非 Customer
  3. 因為 custNameQuery 是一個字元串序列,所以 foreach 循環的迭代變數也必須是 string

下圖演示稍微複雜的轉換。 select 語句返回只捕獲原始 Customer 對象的兩個成員的匿名類型。

  1. 數據源的類型參數始終為查詢中範圍變數的類型。
  2. 因為 select 語句生成匿名類型,所以必須使用 var 隱式類型化查詢變數。
  3. 因為查詢變數的類型是隱式的,所以 foreach 循環中的迭代變數也必須是隱式的。

讓編譯器推斷類型資訊

雖然需要了解查詢操作中的類型關係,但是也可以選擇讓編譯器執行全部工作。 關鍵字 var可用於查詢操作中的任何本地變數。 下圖與前面討論的第二個示例相似。 但是,編譯器為查詢操作中的各個變數提供強類型。