【C#】解析C#中LING的使用


LING提供了一種從數據源中獲取數據的方式,不同的語言已經形成了很多種關聯的數據源。LING(Language Integrated Query,語言集成查詢)提供一種通用的從不同的數據源中獲取數據的通用方式。

LING操作的三個基本要素

所有的LING語句都由三部分組成,它們分別是獲取數據源、創建查詢語句、執行查詢語句。

下面是一個簡單的案例:

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);
        }
    }
}

下面的圖驗證了完整的執行操作,在LING的查詢和平常的查詢概念不同。LING中創建查詢變量是不會獲取任何實際的數據,這一點在后面會詳細介紹。

獲取數據源

LING語句的數據源必須是 IEnumerable或IEnumerable<E>接口的實現類,上面的int[]數組隱式實現了IEnumerable<E>接口,所以可以使用LING語句。
除了可以LING指定已經加載內存中的數據源,也可以為LING指定還未加載到內存中的數據源,下面使用LING to XML加載一個XML文檔到內存中:

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

或者使用LING to db 加載一個數據庫文件到內存中:

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

// Query for customers in London.
IQueryable<Customer> custQuery =
    from cust in db.Customers
    where cust.City == "London"
    select cust;

創建查詢語句

查詢語句指定了從數據源獲取數據源的方式,一般情況下也應該指定數據的排序方式,分組方式或是結構化處理。

上面的查詢操作是從一個Int數據中返回數據,其查詢語句一共使用了三個從句:from,where,select。from從句指定查詢的數據源,where從句使用過濾語句,select從句指定返回語句。

注意:查詢變量本身不產生任何實際的查詢操作也不會返回任何數據,它僅僅是存儲查詢的語句。可以通過在代碼調試來驗證這一點。

執行查詢操作

延遲執行

在上面的案例中,查詢變量僅僅是存儲查詢的命令,實際的查詢操作是對這個查詢變量進行迭代操作。這就是LING的延遲執行。上面的案例中,實際的查詢操作是:

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

這里foreach就是獲取查詢結果的地方,其中num就代表從查詢結果中獲取到值。

因為查詢變量不會存儲任何任何查詢結果,所以可以多次執行這個查詢變量。比如,有一個數據庫可能被不同的應用連續進行更新操作。或者,在一個應用程序中先創建查詢語句然后晚些再執行它。或者,可以在間隔時間內執行相同的查詢語句獲得不同的查詢結果。

立即執行

LING對查詢提供了聚集函數的功能,使用這些功能時首先必須循環訪問這些元素。這些聚集函數有:Count,Max,Average和First。因為查詢本身使用foreach返回查詢結果,因此這些函數都不需要顯式foreach語句。使用這些函數查詢返回的是單個值,不是一個IEnumerable集合。

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

int evenNumCount = evenNumQuery.Count();

若要強制執行並返回緩存查詢的結果,可以調用ToList和ToArray方法。

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();

 

原文鏈接:

LING查詢簡介

C#LING入門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM