從頭開始學LINQ1

來源:互聯網
上載者:User

LINQ出來已經很久了,一直沒有實際使用過,慚愧,今天開始研究下LINQ的用法。以下轉自MSDN:

     查詢是一種從資料來源檢索資料的運算式。查詢通常用專門的查詢語言來表示。隨著時間的推移,人們已經為各種資料來源開發了不同的語言;例如,用於關聯式資料庫的 SQL 和用於 XML 的 XQuery。因此,開發人員不得不針對他們必須支援的每種資料來源或資料格式而學習新的查詢語言。LINQ 通過提供一種跨各種資料來源和資料格式使用資料的一致模型,簡化了這一情況。在 LINQ 查詢中,始終會用到對象。可以使用相同的基本編碼模式來查詢和轉換 XML 文檔、SQL 資料庫、ADO.NET 資料集、.NET 集合中的資料以及對其有 LINQ 提供者可用的任何其他格式的資料。查詢操作的三個部分所有 LINQ 查詢操作都由以下三個不同的操作組成:擷取資料來源。 建立查詢。 執行查詢。 下面的樣本示範如何用原始碼表示查詢操作的三個部分。為了方便起見,此樣本將一個整數數組用作資料來源;但其中涉及的概念同樣適用於其他資料來源。本主題的其餘部分也會引用此樣本。 

Code
 class Program
    {
        static void Main(string[] args)
        {
            // The Three Parts of a LINQ Query:
            // 1. Data source.
            int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

            // 2. Query creation.
            // numQuery is an IEnumerable<int>
            var numQuery =
            from num in numbers
            where (num % 2) == 0
            select num;

            // 3. Query execution.
            foreach (int num in numQuery)
            {
                Console.Write("{0,1} ", num);
            }

        }
    }

    

顯示了完整的查詢操作。在 LINQ 中,查詢的執行與查詢本身截然不同;換句話說,如果只是建立查詢變數,則不會檢索任何資料。

資料來源

在上一個樣本中,由於資料來源是數組,因此它隱式支援泛型 IEnumerable<(Of <(T>)>) 介面。這一事實意味著該資料來源可以用 LINQ 進行查詢。在 foreach 語句中執行查詢,而 foreach 要求使用 IEnumerable 或 IEnumerable<(Of <(T>)>)。支援 IEnumerable<(Of <(T>)>) 或派生介面(如泛型 IQueryable<(Of <(T>)>))的類型稱為“可查詢型別”。

可查詢型別不需要進行修改或特殊處理就可以用作 LINQ 資料來源。如果來源資料還沒有作為可查詢型別出現在記憶體中,則 LINQ 提供者必須以此方式表示來源資料。例如,LINQ to XML 將 XML 文檔載入到可查詢的 XElement 類型中:

 

 

// Create a data source from an XML document.
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");

 

 

在 LINQ to SQL 中,首先手動或使用 物件關聯式設計工具(O/R 設計工具) 在設計時建立對象關係映射。針對這些對象編寫查詢,然後由 LINQ to SQL 在運行時處理與資料庫的通訊。在下面的樣本中,Customer 表示資料庫中的特定表,並且 Table 支援派生自 IEnumerable<(Of <(T>)>) 的泛型 IQueryable<(Of <(T>)>) 介面。

 

DataContext db = new DataContext(@"c:\northwind\northwnd.mdf");

 

 

有關如何建立特定類型的資料來源的更多資訊,請參見各種 LINQ 提供者的文檔。但基本規則非常簡單:LINQ 資料來源是支援泛型 IEnumerable<(Of <(T>)>) 介面或從該介面繼承的介面的任意對象。

 

查詢

查詢指定要從資料來源中檢索的資訊。查詢還可以指定在返回這些資訊之前如何對其進行排序、分組和結構化。查詢儲存在查詢變數中,並用查詢運算式進行初始化。為使編寫查詢的工作變得更加容易,C# 引入了新的查詢文法。

上一個樣本中的查詢從整數數組中返回所有偶數。該查詢運算式包含三個子句:from、where 和 select。(如果您熟悉 SQL,您會注意到這些子句的順序與 SQL 中的順序相反。) from 子句指定資料來源,where 子句應用篩選器,select 子句指定返回的元素的類型。LINQ 查詢運算式(C# 編程指南)一節中詳細討論了這些子句和其他查詢子句。目前需要注意的是,在 LINQ 中,查詢變數本身不執行任何操作並且不返回任何資料。它只是儲存在以後某個時刻執行查詢時為產生結果而必需的資訊。有關在幕後是如何構建查詢的更多資訊,請參見標準查詢運算子概述。

查詢執行

順延強制

如前所述,查詢變數本身只是儲存查詢命令。實際的查詢執行會延遲到在 foreach 語句中逐一查看查詢變數時發生。此概念稱為“順延強制”,下面的樣本對此進行了示範:

 

 

//  Query execution. 
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}

 

 

foreach 語句也是檢索查詢結果的地方。例如,在上一個查詢中,迭代變數 num 儲存了返回的序列中的每個值(一次儲存一個值)。

由於查詢變數本身從不儲存查詢結果,因此可以根據需要隨意執行查詢。例如,可以通過一個單獨的應用程式持續更新資料庫。在應用程式中,可以建立一個檢索最新資料的查詢,並可以按某一時間間隔反覆執行該查詢以便每次檢索不同的結果。

強制立即執行

對一系列源元素執資料列彙總函式的查詢必須首先逐一查看這些元素。Count、Max、Average 和 First 就屬於此類查詢。由於查詢本身必須使用 foreach 以便返回結果,因此這些查詢在執行時不使用顯式 foreach 語句。另外還要注意,這些類型的查詢返回單個值,而不是 IEnumerable 集合。下面的查詢返回源數組中偶數的計數:

 

 

var evenNumQuery = 
from num in numbers
where (num % 2) == 0
select num;

int evenNumCount = evenNumQuery.Count();

 

 

若要強制立即執行任意查詢並緩衝其結果,可以調用 ToList<(Of <(TSource>)>) 或 ToArray<(Of <(TSource>)>) 方法。

 

 

List<int> numQuery2 =
(from num in numbers
where (num % 2) == 0
select num).ToList();

// or like this:
// numQuery3 is still an int[]

var numQuery3 =
(from num in numbers
where (num % 2) == 0
select num).ToArray();

 

 

此外,還可以通過在緊跟查詢運算式之後的位置放置一個 foreach 迴圈來強制執行查詢。但是,通過調用 ToListToArray,也可以將所有資料緩衝在單個集合對象中。

       由此可見,LINQ文法為:

       var 變數名=from 集合中的個體 in 集合

       where (條件運算式)

       select 集合中的個體;

其中,集合必須實現介面IEnumerable<T>,查詢預設為待需要用到結果時再執行,也可以設定為立即執行,這時返回的查詢結果調用.toLIst或者.toArray,這樣能儲存結果集。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.