Take a look at GW

【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入门

posted @ 2018-10-11 23:48  HDWK  阅读(3125)  评论(0编辑  收藏  举报