若要有效編寫查詢,應瞭解完整的查詢操做中的變量類型是如何所有彼此關聯的。 若是瞭解這些關係,就可以更容易地理解文檔中的 LINQ 示例和代碼示例。 另外,還能瞭解在使用 var
隱式對變量進行類型化時的後臺操做。html
LINQ 查詢操做在數據源、查詢自己及查詢執行中是強類型化的。 查詢中變量的類型必須與數據源中元素的類型和 foreach
語句中迭代變量的類型兼容。 此強類型保證在編譯時捕獲類型錯誤,以即可以在用戶遇到這些錯誤以前更正它們。spa
爲了演示這些類型關係,下面的大多數示例對全部變量使用顯式類型。 最後一個示例演示在利用使用 var 的隱式類型時,如何應用相同的原則。3d
下圖演示不對數據執行轉換的 LINQ to Objects 查詢操做。 源包含一個字符串序列,查詢輸出也是一個字符串序列。code
數據源的類型參數決定範圍變量的類型。htm
所選對象的類型決定查詢變量的類型。 此處的 name
是一個字符串。 所以,查詢變量是一個 IEnumerable<string>
。對象
在 foreach
語句中循環訪問查詢變量。 由於查詢變量是一個字符串序列,因此迭代變量也是一個字符串。blog
下圖演示對數據執行簡單轉換的 LINQ to SQL 查詢操做。 查詢將一個 Customer
對象序列用做輸入,並只選擇結果中的 Name
屬性。 由於 Name
是一個字符串,因此查詢生成一個字符串序列做爲輸出。開發
數據源的類型參數決定範圍變量的類型。文檔
select
語句返回 Name
屬性,而非完整的 Customer
對象。 由於 Name
是一個字符串,因此 custNameQuery
的類型參數是 string
,而非 Customer
。字符串
由於 custNameQuery
是一個字符串序列,因此 foreach
循環的迭代變量也必須是 string
。
下圖演示稍微複雜的轉換。 select
語句返回只捕獲原始 Customer
對象的兩個成員的匿名類型。
數據源的類型參數始終爲查詢中範圍變量的類型。
由於 select
語句生成匿名類型,因此必須使用 var
隱式類型化查詢變量。
由於查詢變量的類型是隱式的,因此 foreach
循環中的迭代變量也必須是隱式的。
雖然須要瞭解查詢操做中的類型關係,可是也能夠選擇讓編譯器執行所有工做。 關鍵字 var可用於查詢操做中的任何本地變量。 下圖與前面討論的第二個示例類似。 可是,編譯器爲查詢操做中的各個變量提供強類型。