溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

LINQ查詢和泛型類型的關(guān)系是什么

發(fā)布時間:2021-12-02 09:30:43 來源:億速云 閱讀:146 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“LINQ查詢和泛型類型的關(guān)系是什么”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

LINQ查詢基于泛型類型,在 .NET Framework 的 2.0 版中引入了泛型類型。您無需深入了解泛型即可開始編寫查詢。但是,您可能需要了解兩個基本概念:

1.當(dāng)您創(chuàng)建泛型集合類(如 List﹤(Of ﹤(T﹥)﹥))的實(shí)例時,您將“T”替換為列表將包含的對象的類型。例如,字符串列表表示為 List﹤string﹥,Customer 對象列表表示為 List﹤Customer﹥。泛型列表是強(qiáng)類型的,且提供了比將其元素存儲為 Object 的集合更多的好處。如果您嘗試將 Customer 添加到 List﹤string﹥,則會在編譯時出現(xiàn)一條錯誤。泛型集合易于使用的原因是您不必執(zhí)行運(yùn)行時類型強(qiáng)制轉(zhuǎn)換。

2.IEnumerable﹤(Of ﹤(T﹥)﹥) 是一個接口,通過該接口,可以使用 foreach 語句來枚舉泛型集合類。泛型集合類支持 IEnumerable﹤(Of ﹤(T﹥)﹥),就像非泛型集合類(如 ArrayList)支持 IEnumerable。

3.LINQ 查詢變量類型化為 IEnumerable﹤(Of ﹤(T﹥)﹥) 或派生類型,如 IQueryable﹤(Of ﹤(T﹥)﹥)。當(dāng)您看到類型化為 IEnumerable﹤Customer﹥ 的查詢變量時,這只意味著在執(zhí)行該查詢時,該查詢將生成包含零個或多個 Customer 對象的序列。

LINQ查詢的使用:

IEnumerable﹤Customer﹥ customerQuery =  from cust in customers  where cust.City == "London" select cust;  foreach (Customer customer in customerQuery)  {  Console.WriteLine(customer.LastName +   ", " + customer.FirstName);  }

如果您愿意,可以使用 var 關(guān)鍵字來避免使用泛型語法。var 關(guān)鍵字指示編譯器通過查看在 from 子句中指定的數(shù)據(jù)源來推斷查詢變量的類型。下面的示例生成與上一個示例相同的編譯代碼:

var customerQuery2 =   from cust in customers  where cust.City == "London" select cust;  foreach(var customer in customerQuery2)  {  Console.WriteLine(customer.LastName +   ", " + customer.FirstName);  }

當(dāng)變量的類型明顯或顯式指定嵌套泛型類型(如由組查詢生成的那些類型)并不重要時,var 關(guān)鍵字很有用。通常,我建議如果您使用 var,應(yīng)意識到這可能使您的代碼更難以讓別人理解。

若要有效編寫查詢,您應(yīng)該了解完整的查詢操作中的變量類型是如何全部彼此關(guān)聯(lián)的。如果您了解這些關(guān)系,就能夠更容易地理解文檔中的 LINQ 示例和代碼示例。另外,還能了解在使用 var 隱式對變量進(jìn)行類型化時的后臺操作。

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

為了演示這些類型關(guān)系,下面的大多數(shù)示例對所有變量使用顯式類型。

LINQ查詢的一些問題:

下圖演示不對數(shù)據(jù)執(zhí)行轉(zhuǎn)換的 LINQ to Objects 查詢操作。源包含一個字符串序列,查詢輸出也是一個字符串序列。

LINQ查詢和泛型類型的關(guān)系是什么 

1.數(shù)據(jù)源的類型參數(shù)決定范圍變量的類型。

2.選擇的對象的類型決定查詢變量的類型。此處的 name 為一個字符串。因此,查詢變量是一個 IEnumerable﹤string﹥。

3.在 foreach 語句中循環(huán)訪問查詢變量。因?yàn)椴樵冏兞渴且粋€字符串序列,所以迭代變量也是一個字符串。

下圖演示對數(shù)據(jù)執(zhí)行簡單轉(zhuǎn)換的 LINQ to SQL 查詢操作。查詢將一個 Customer 對象序列用作輸入,并只選擇結(jié)果中的 Name 屬性。因?yàn)?Name 是一個字符串,所以查詢生成一個字符串序列作為輸出。

LINQ查詢和泛型類型的關(guān)系是什么

1.數(shù)據(jù)源的類型參數(shù)決定范圍變量的類型。

2.select 語句返回 Name 屬性,而非完整的 Customer 對象。因?yàn)?Name 是一個字符串,所以 custNameQuery 的類型參數(shù)是 string,而非 Customer。

3.因?yàn)?custNameQuery 是一個字符串序列,所以 foreach 循環(huán)的迭代變量也必須是 string。

下圖演示稍微復(fù)雜的轉(zhuǎn)換。select 語句返回只捕獲原始 Customer 對象的兩個成員的匿名類型。

LINQ查詢和泛型類型的關(guān)系是什么

1.數(shù)據(jù)源的類型參數(shù)始終為查詢中的范圍變量的類型。

2.因?yàn)?select 語句生成匿名類型,所以必須使用 var 隱式類型化查詢變量。

3.因?yàn)椴樵冏兞康念愋褪请[式的,所以 foreach 循環(huán)中的迭代變量也必須是隱式的。

4.雖然您應(yīng)該了解查詢操作中的類型關(guān)系,但是您也可以選擇讓編譯器為您執(zhí)行全部工作。關(guān)鍵字 var 可用于查詢操作中的任何局部變量。下圖與前面討論的第二個示例完全等效。***的區(qū)別是編譯器將為查詢操作中的各個變量提供強(qiáng)類型:

LINQ查詢和泛型類型的關(guān)系是什么

“LINQ查詢和泛型類型的關(guān)系是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI