程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> LINQ To SQL深入學習系列之四 LINQ查詢基礎

LINQ To SQL深入學習系列之四 LINQ查詢基礎

編輯:關於.NET

本文部分內容整理自msdn

一、LINQ的概念:

LINQ是Language Integrated Query(語言集成查詢)的簡稱,它是集成在.NET編程語言中的一種特性 ,這使得查詢表達式可以得到很好的編譯時語法檢查,豐富的元數據,智能感知等強類型語言的好處LINQ 是 Visual Studio 2008 和 .NET Framework 3.5 版中一項突破性的創新,它在對象領域和數據領域之間 架起了一座橋梁。

二、LINQ出現的背景:

傳統上,針對數據的查詢都是以簡單的字符串表示,而沒有編譯時類型檢查或 IntelliSense 支持。 此外,您還必須針對以下各種數據源學習不同的查詢語言:SQL 數據庫、XML 文檔、各種 Web 服務等。 LINQ 使查詢成為 C# 和 Visual Basic 中的一等語言構造。您可以使用語言關鍵字和熟悉的運算符針對 強類型化對象集合編寫查詢。在 Visual Studio 中,可以用 Visual Basic 或 C# 為以下各種數據源編 寫 LINQ 查詢:SQL Server 數據庫、XML 文檔、ADO.NET 數據集以及支持 IEnumerable 或泛型 IEnumerable<T>) 接口的任意對象集合。此外,還計劃了對 ADO.NET Entity Framework 的 LINQ 支持,並且第三方為許多 Web 服務和其他數據庫實現編寫了 LINQ 提供程序。

三、查詢表達式解析:

查詢解析實例

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };//獲取數據源。
  var lowNums = from n in numbers
                where n < 5
                select n;            //創建查詢。
   Console.WriteLine("Numbers < 5:");
   foreach (var x in lowNums)            //執行查詢
   {
          Console.WriteLine(x);
   }

結果為:

Numbers < 5:
4
1
3
2
0

在語義上等同於以下方法風格的查詢

 var lowNums = numbers
               .Where(s => s < 5)
               .OrderBy(s => s)
               .Select(s => s);

在往下講解之前我們先介紹些基礎知識Func泛型委托,這是.net幫我們定義好的一種委托形式。

Func(T, TResult) 泛型委托:封裝一個具有一個參數並返回 TResult 參數指定的類型值的方法。寫 成委托的格式如下:

public delegate TResult Func<T, TResult>(T arg)

Func泛型委托總共有四種:

Func(T1, T2, TResult) 泛型委托

Func(T1, T2, T3, TResult) 泛型委托

Func(T1, T2, T3, T4, TResult) 泛型委托

Lamda表達式其實就相當於以下的匿名委托

Func<int, bool> filter = delegate(int s) { return s < 5; }; //相當於s => s < 5

Func<int, int> extract = delegate(int s) { return s; };  //相當於s => s

Func<int, int> get = delegate(int s) { return s; };  //相當於s => s

var lowNums = numbers.Where(filter).OrderBy(extract).Select(get);

where方法是一個定義於System.Linq命名空間的擴展方法

where源碼

namespace System.Linq
{
   public static class Enumerable
   {
       public static IEnumerable<TSource>      Where<TSource> (
                this IEnumerable<TSource> source, 
                Func<TSource, bool> predicate)
       {
              foreach(TSource item in source)
        {
               if(predicate(item))
               {
                yeild return item;
               }
        }
       }
   }
}

這裡的predicate就是你傳入的Lamda表達式,where會根據這個Lamda表達式進行數據篩選。

所有 LINQ 查詢操作都由以下三個不同的操作組成:

1、獲取數據源。

2、創建查詢。

3、執行查詢。

數據源:

在上一個示例中,由於數據源是數組,因此它隱式支持泛型 IEnumerable<T>)接口。這一事實 意味著該數據源可以用 LINQ 進行查詢。在 foreach 語句中執行查詢,而 foreach 要求使用 IEnumerable 或 IEnumerable<T>)。支持 IEnumerable<T>)或派生接口(如泛型 IQueryable<T>)的類型稱為“可查詢類型”。

查詢:

查詢指定要從數據源中檢索的信息。查詢還可以指定在返回這些信息之前如何對其進行排序、分組和 結構化。查詢存儲在查詢變量中,並用查詢表達式進行初始化。為使編寫查詢的工作變得更加容易,C# 引入了新的查詢語法。上一個示例中的查詢表達式包含三個子句:from、where 和 select。(如果您熟 悉 SQL,您會注意到這些子句的順序與 SQL 中的順序相反。) from 子句指定數據源,where 子句應用 篩選器,select 子句指定返回的元素的類型。目前需要注意的是,在 LINQ 中,查詢變量本身不執行任 何操作並且不返回任何數據。它只是存儲在以後某個時刻執行查詢時為生成結果而必需的信息。

執行查詢:

上面例子中的foreach循環就是LINQ 的執行過程,LINQ中的執行查詢分兩種,強制立即執行和延遲執 行,我們會在以後的部分中詳細進行講解。

四、LINQ 和泛型類型

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

1、當您創建泛型集合類(如 List<T>))的實例時,您將“T”替換為列表將包含的對象的類型 。例如,字符串列表表示為 List<string>,Customer 對象列表表示為 List<Customer>。 泛型列表是強類型的,且提供了比將其元素存儲為 Object 的集合更多的好處。如果您嘗試將 Customer 添加到 List<string>,則會在編譯時出現一條錯誤。泛型集合易於使用的原因是您不必執行運行 時類型強制轉換。

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

LINQ 查詢變量都實現或繼承了 IEnumerable<T> 接口,如 IQueryable<T>。當您看到類 型化為 IEnumerable<Customer> 的查詢變量時,這只意味著在執行該查詢時,該查詢將生成包含 零個或多個 Customer 對象的序列。

IEnumerable<Customer> customerQuery =
    from cust in customers
    where cust.City == "London"
    select cust;

foreach (Customer customer in customerQuery)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved