首页 > 代码库 > LinQ开篇介绍

LinQ开篇介绍

   语言集成查询(LINQ) Visual Studio2008中引入的一组功能。可为 C# 和 Visual Basic 语言语法提供强大的查询功能。 LINQ引入了标准易学的数据查询和更新模式,可以扩展该方法来支持任何类型的数据存储。 Visual Studio 包括 LINQ 提供程序集,后者支持将 LINQ 与.NET Framework 集合、SQL Server 数据库、ADO.NET 数据集和 XML 文档结合使用。

 

LINQ查询中,可以使用相同的基本编码模式来查询和转换xml文档,sql数据库,ADO.NET数据集以及其他格式的数据。总的说是以下三部分

  • LINQ to Objects 主要负责对象的查询
  • LINQ to XML 主要负责 XML 的查询
  • LINQ to ADO.NET 主要负责数据库的查询
    • LINQ to SQL

 

总体架构图



 

看完了基本的架构图我们就来看看LINQ给我们提供的查询操作吧。

 

LINQ的查询分为三个部分


  • 获取数据源
  • 创建查询
  • 执行查询

 

下面我们就来做个初体验。在没有linq前,我们这样查询

 

从number数组中提权耦并降序排列
 
int[] numbers = newint[] { 6, 4, 3, 2, 9, 1, 7, 8, 5 };
 
List<int> even= new List<int>();
 
foreach (int numberin numbers)
{
    if (number % 2 == 0)
    {
        even.Add(number);
    }
}
 
even.Sort();
even.Reverse();

有了linq我们这样查询

int[] numbers = newint[] { 6, 4, 3, 2, 9, 1, 7, 8, 5 };
 
var even = numbers
    .Where(p => p % 2 == 0)
    .Select(p => p)
    .OrderByDescending(p => p);

 


 

以上的查询使用了Lamdba的方法。



下面我们演示如何使用源代码查询的三个部分

 
class IntroToLINQ
{       
    static void Main()
    {
        // LINQ的构成,三部分:
        // 1. Data source.
        int[] numbers = new int[7] { 0, 1, 2,3, 4, 5, 6 };
 
        // 2. 创建查询
        // numQuery is anIEnumerable<int>
        var numQuery =
            from num in numbers
            where (num % 2) == 0
            select num;
 
        // 3. 执行查询.
        foreach (int num in numQuery)
        {
            Console.Write("{0,1} ",num);
        }
    }
}


注意 select中的  num为查询变量

 在 LINQ中,查询的执行与查询本身截然不同;换句话说,如果只是创建查询变量,则不会检索任何数据。

 


 

 

查询


上一个实例中查询从整数数组中返回所有偶数。该查询表达式包含三个字句。fromwhereselect(这些字句的顺序与SQL中的顺序相反).from指定查询的数据源,where字句应用筛选器,select字句制定返回的元素类型。LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。 它只是存储在以后某个时刻执行查询时为生成结果而必需的信息

 

查询执行


延迟执行

如前所述,查询变量本身只是存储查询命令。 实际的查询执行会延迟到在 foreach语句中循环访问查询变量时发生。 此概念称为“延迟执行”,下面的示例对此进行了演示: 

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

该执行方法才会调用上面的查询方法。并且有多少个数据执行多少次的查询操作。迭代变量 num 保存了返回的序列中的每个值(一次保存一个值)

 

小结:


以上是对LINQ的开篇介绍。LINQ查询表达式的基本构成,其中涉及到了延迟加载。说道这个延迟加载,整的很神秘一样,看透了也只是一个运行时的方法调用。后续介绍linq的对象查询。每个对象查询中都少不了委托泛型,以及匿名函数和lamdba的写法,所以他们是相辅相成的。