Language-Integrated Query (LINQ) 是一組技術的名稱,這組技術所憑藉的基礎是將查詢功能
直接整合至 C# 語言 (以及 Visual Basic,也可能是其他任何 .NET 語言) 中。 透過 LINQ,
查詢現在已成為第一級的語言建構,就如同類別、方法、事件等等。

對於撰寫查詢的開發人員而言,LINQ 最明顯的「語言整合」部分就是它的查詢運算式。 查詢
運算式是以 C# 3.0 所引入的宣告式「查詢語法」(Query Syntax) 來撰寫。

透過使用查詢語法,您可以使用最少的程式碼,在資料來源上執行更為複雜的篩選、排序和群
組等作業。 您可以使用相同的基本查詢運算式模式,在 SQL 資料庫、ADO.NET 資料集、XML
文件和資料流以及 .NET 集合中查詢及轉換資料。


class LINQQueryExpressions
{
    static void Main()
    {

        // Specify the data source.
        int[] scores = new int[] { 97, 92, 81, 60 };

        // Define the query expression.
        IEnumerable<int> scoreQuery =
            from score in scores
            where score > 80
            select score;

        // Execute the query.
        foreach (int i in scoreQuery)
        {
            Console.Write(i + " ");
        }           
    }
}
// Output: 97 92 81

=======================================================================================

「查詢」(Query) 是一種從資料來源擷取資料的運算式, 而且使用專用的查詢語言來表示。
一段時間之後,針對不同類型的資料來源已開發出不同的語言,例如 SQL 是用於關聯式資料庫,
而 XQuery 則是 XML。 因此,開發人員必須針對他們所需支援的資料來源類型或資料格式學習新
的查詢語言。

LINQ 提供一致的模型來使用各種資料來源和格式的資料,從而簡化此情況。
在 LINQ 查詢中,您所處理的一定是物件。
不論您要查詢及轉換的資料是存在 XML 文件、SQL 資料庫、ADO.NET 資料集,還是 .NET 集合,
以及其他任何有可用 LINQ 提供者 (Provider) 的格式中,都是使用相同的基本程式碼撰寫模式。

查詢作業的三個部分

-----------------------------------------

所有的 LINQ 查詢作業都包含三個不同的動作:

1.取得資料來源。

2.建立查詢。

3.執行查詢。


class IntroToLINQ
{       
    static void Main()
    {
        // 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);
        }
    }
}
=======================================================================================

資料來源 :

XElement contacts = XElement.Load(@"c:\myContactList.xml");
DataContext db = new DataContext(@"c:\northwind\northwnd.mdf");

查詢執行 :
var evenNumQuery =
    from num in numbers
    where (num % 2) == 0
    select num;

int evenNumCount = evenNumQuery.Count();

=======================================================================================
LINQ 查詢是以 .NET Framework 2.0 版中就引進的泛型型別為基礎。
您不需要對泛型型別有相當程度的了解,就可以開始撰寫查詢。不過,您可能需要了解兩個基本概念:

1.建立泛型集合類別 (Class) (如 List<T>) 的執行個體 (Instance) 時,請將 "T" 取代為清單中會包含之物件的型別。
 例如,字串的清單是以 List<string> 表示,而 Customer 物件的清單則是以 List<Customer> 表示。 泛型清單是強型別的,
而且優點多於以 Object 形式儲存項目的集合。

如果您嘗試將 Customer 加入至 List<string>,就會在編譯時期接收到錯誤。 泛型集合不需要執行執行階段的
型別轉換 (Type Cast),因此十分容易使用。

2.IEnumerable<T> 這個介面可讓您使用 foreach 陳述式來列舉泛型集合類別。 就像 ArrayList 等非泛型集合類別
支援 IEnumerable,泛型集合類別同樣可以支援 IEnumerable<T>。

 

讓編譯器處理泛型型別宣告

--------------------------------------------------------------------------------

想要的話,您可以使用 var 關鍵字來避免使用泛型語法。 var 關鍵字會指示編譯器 (Compiler)
查看 from 子句中指定的資料來源,來推斷查詢變數的型別。

var customerQuery2 =
    from cust in customers
    where cust.City == "London"
    select cust;

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

--------------------------------------------------------------------------------
group ... by ... / orderby ... 範例

var custQuery =
    from cust in customers
    group cust by cust.City into custGroup
    where custGroup.Count() > 2
    orderby custGroup.Key
    select custGroup;

--------------------------------------------------------------------------------

Queryable.FirstOrDefault<TSource> 方法
傳回序列的第一個項目;如果序列中沒有包含任何項目,則傳回預設值。


 

全站熱搜
創作者介紹
創作者 albert0956 的頭像
albert0956

albert0956的部落格

albert0956 發表在 痞客邦 留言(0) 人氣()