|
查詢(xún)操作中的類(lèi)型關(guān)系 (LINQ)
若要有效編寫(xiě)查詢(xún),您應(yīng)該了解完整的查詢(xún)操作中的變量類(lèi)型是如何全部彼此關(guān)聯(lián)的。如果您了解這些關(guān)系,就能夠更容易地理解文檔中的 LINQ 示例和代碼示例。另外,還能了解在使用 var 隱式對(duì)變量進(jìn)行類(lèi)型化時(shí)的后臺(tái)操作。
LINQ 查詢(xún)操作在數(shù)據(jù)源、查詢(xún)本身及查詢(xún)執(zhí)行中是強(qiáng)類(lèi)型的。查詢(xún)中變量的類(lèi)型必須與數(shù)據(jù)源中元素的類(lèi)型和 foreach 語(yǔ)句中迭代變量的類(lèi)型兼容。此強(qiáng)類(lèi)型保證在編譯時(shí)捕獲類(lèi)型錯(cuò)誤,以便可以在用戶(hù)遇到這些錯(cuò)誤之前更正它們。
為了演示這些類(lèi)型關(guān)系,下面的大多數(shù)示例對(duì)所有變量使用顯式類(lèi)型。最后一個(gè)示例演示在您利用使用 var 的隱式類(lèi)型時(shí),如何應(yīng)用相同的原則。
不轉(zhuǎn)換源數(shù)據(jù)的查詢(xún)
下圖演示不對(duì)數(shù)據(jù)執(zhí)行轉(zhuǎn)換的 LINQ to Objects 查詢(xún)操作。源包含一個(gè)字符串序列,查詢(xún)輸出也是一個(gè)字符串序列。
1、數(shù)據(jù)源的類(lèi)型參數(shù)決定范圍變量的類(lèi)型。
2、選擇的對(duì)象的類(lèi)型決定查詢(xún)變量的類(lèi)型。此處的 name 為一個(gè)字符串。因此,查詢(xún)變量是一個(gè) IEnumerable。
3、在 foreach 語(yǔ)句中循環(huán)訪問(wèn)查詢(xún)變量。因?yàn)椴樵?xún)變量是一個(gè)字符串序列,所以迭代變量也是一個(gè)字符串。
轉(zhuǎn)換源數(shù)據(jù)的查詢(xún)
下圖演示對(duì)數(shù)據(jù)執(zhí)行簡(jiǎn)單轉(zhuǎn)換的 LINQ to SQL 查詢(xún)操作。查詢(xún)將一個(gè) Customer 對(duì)象序列用作輸入,并只選擇結(jié)果中的 Name 屬性。因?yàn)?Name 是一個(gè)字符串,所以查詢(xún)生成一個(gè)字符串序列作為輸出。
1、數(shù)據(jù)源的類(lèi)型參數(shù)決定范圍變量的類(lèi)型。
2、select 語(yǔ)句返回 Name 屬性,而非完整的 Customer 對(duì)象。因?yàn)?Name 是一個(gè)字符串,所以 custNameQuery 的類(lèi)型參數(shù)是 string,而非 Customer。
3、因?yàn)?custNameQuery 是一個(gè)字符串序列,所以 foreach 循環(huán)的迭代變量也必須是 string。
下圖演示稍微復(fù)雜的轉(zhuǎn)換。select 語(yǔ)句返回只捕獲原始 Customer 對(duì)象的兩個(gè)成員的匿名類(lèi)型。
1、數(shù)據(jù)源的類(lèi)型參數(shù)始終為查詢(xún)中的范圍變量的類(lèi)型。
2、因?yàn)?select 語(yǔ)句生成匿名類(lèi)型,所以必須使用 var 隱式類(lèi)型化查詢(xún)變量。
3、因?yàn)椴樵?xún)變量的類(lèi)型是隱式的,所以 foreach 循環(huán)中的迭代變量也必須是隱式的。
讓編譯器推斷類(lèi)型信息
雖然您應(yīng)該了解查詢(xún)操作中的類(lèi)型關(guān)系,但是您也可以選擇讓編譯器為您執(zhí)行全部工作。關(guān)鍵字 var 可用于查詢(xún)操作中的任何局部變量。下圖與前面討論的第二個(gè)示例完全等效。唯一的區(qū)別是編譯器將為查詢(xún)操作中的各個(gè)變量提供強(qiáng)類(lèi)型:
it知識(shí)庫(kù):查詢(xún)操作中的類(lèi)型關(guān)系 (LINQ),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。