.NET LINQ概述

 

  • LINQ

     语言集成查询 (LINQ) 是 Visual Studio
2008 中引入的一致组功能,它以目标领域和多少领域里面架自了一如既往所桥梁。可也
C# 和 Visual Basic 语言语法提供强有力的询问功能。 LINQ
引入了标准、易学的多少查询及创新模式,该技能好扩展为几支持任何项目的数存储。Visual
Studio 包含 LINQ 提供程序的程序集,借助这些程序集,就能够以 LINQ 用于 .NET
Framework 集合、SQL Server 数据库、ADO.NET 数据集和 XML 文档。

  • LINQ应用场景
    • LINQ to
      Object:针对数组和集合
    • LINQ to XML:针对XML文档
    • LINQ
      to DataSet:针对ADO的DataSet对象
    • LINQ to Entites:针对EF
    • Parallel
      LINQ:并行处理LINQ查询返回的数目
  • LINQ 查询

     查询是平栽起数据源检索数据的表达式。
查询普通用特别的查询语言来代表。
随着时间的推迟,人们早就也各种数据源开发了不同的言语;例如,用于关系数据库的
SQL 和用于 XML 的 XQuery。
因此,开发人员不得不对他们必须支持的各种数据源或数格式而习新的询问语言。
LINQ
通过提供相同种超各种数据源和多少格式使用数据的如出一辙模型,简化了立即同样场面。
在 LINQ 查询中,始终会用到对象。 可以下同一之骨干编码模式来查询和更换
XML 文档、SQL 数据库、ADO.NET 数据集、.NET 集合中的数码以及针对该来 LINQ
提供程序可用之另外其它格式的多寡。

 

    • 获取数据源

     LINQ语句子是于 foreach
语词被执查询,而 foreach 要求采取 IEnumerable 或
IEnumerable<T>。支持 IEnumerable<T> 或派生接口(如泛型
IQueryable<T>)的项目称为“可查询类型”。

Northwnd db = new Northwnd(@"c:\northwnd.mdf");
    • 创立查询

     查询指定要由数量源中检索的信息。查询还足以指定在回这些信前如何对该进行排序、分组和结构化。查询存储于询问变量中,并因此查询表达式进行初始化。

    • 尽查询
      • 缓执行

   
 查询变量本身只是存储查询命令。实际的询问执行会延迟到当 foreach
语词被循环访问查询变量时来。此概念叫“延迟执行”

foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}
      • 强制立即实施

   
 对同样名目繁多源元素执行聚合函数的询问必须首先循环访问这些元素。
Count、Max、Average 和 First 就属此类查询。由于查询自己要动
foreach 以便回到结果,因此这些查询在推行时无使用显式 foreach
语句。另外还要小心,这些类别的查询返回单个值,而未是 IEnumerable
集合。

var evenNumQuery = 
    from num in numbers
    where (num % 2) == 0
    select num;
int evenNumCount = evenNumQuery.Count();

   
 若要强制立即实施任意查询并缓存其结果,可以调用 ToList<TSource> 或
ToArray<TSource> 方法。

List<int> numQuery2 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToList();
  • 支持 LINQ 的功能
    • 查询表达式

     查询表达式使用类于 SQL 或 XQuery
的声明性语法来询问 IEnumerable 集合。在编译时,查询语法转换为对 LINQ
提供程序的正儿八经查询运算符扩展方法实现之艺术调用。应用程序通过采取 using
指令指定适当的命名空间来支配范围外之正经查询运算符。下面的询问表达式获取一个字符串数组,按字符串中之率先个字符对字符串进行分组,然后对各组进行排序。

var query = from str in stringArray
            group str by str[0] into stringGroup
            orderby stringGroup.Key
            select stringGroup;
    • 隐式类型化变量

   
 不必在宣称并初始化变量时显式指定项目,您得运用 var
修饰符来指示编译器推断并分配项目,声明也 var
的变量和显式指定其类别的变量一样都是强类型。通过下
var,可以创建匿名类型,但它们只是用以其他部分变量。也得以应用隐式类型声明数组。

var number = 5;
var name = "Virginia";
var query = from str in stringArray
            where str[0] == 'm'
            select str;
    • 靶及集合初始值设定项

   
 通过对象与集合初始值设定项,初始化对象时无需呢目标显式调用构造函数。初始值设定项普通用在将源数据投影至新数据类型的查询表达式中。假定一个类名为
Customer,具有公共 Name 和 Phone
属性,可以以下列代码中所显示使用对象初始值设定项:

Customer cust = new Customer { Name = "Mike", Phone = "555-1212" };
    • 匿名类型

   
 匿名类型由编译器构建,且项目名称只可用来编译器。匿名类型提供了相同种植在询问结果遭遇即分组一组属性的方便方法,无需定义单独的命名类型。使用初的表达式和对象初始值设定项初始化匿名类型。

select new {name = cust.Name, phone = cust.Phone};
    • 恢宏方法

   
 扩展方法是一模一样种植而与项目涉及的静态方法,因此好像实例方法那样对项目调用它。实际上,此功能一旦您能够以新措施“添加”到现有项目,而不见面实际修改其。标准查询运算符是一致组扩展方法,它们也落实
IEnumerable<T> 的别样项目提供 LINQ 查询功能。

    • Lambda 表达式

     Lambda
表达式是均等栽内联函数,该函数使用 =>
运算符将输入参数和函数体分离,并且可于编译时变为委托或达式树。在
LINQ 编程中,在你对标准查询运算符进行直接方式调用时,会遇见 lambda
表达式。

    • 活动实现的性能

     通过自行实现的特性,可以另行明确地宣称属性。当你要是下面的演示中所出示声明属性时,编译器将创造一个私房的匿名支持字段,该字段只能通过性
getter 和 setter 进行访问。

public string Name {get; set;}
  • LINQ 泛型
    •  IEnumerable<T> 变量

     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);
}
    • 编译器处理泛型类型声明

     如果您愿意,可以使用 var
关键字来避免采用泛型语法。 var 关键字指示编译器通过查阅在 from
子句被指定的多少源来推断查询变量的品种。当变量的花色明显要显式指定嵌套泛型类型(如出于组查询生成的那些类型)并无重大时,var
关键字很有因此。通常,我们建议一旦你使用
var,应意识及这或许只要你的代码更难让旁人知道。

var customerQuery2 = 
    from cust in customers
    where cust.City == "London"
    select cust;
foreach(var customer in customerQuery2)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
  • LINQ to Objects

     术语“LINQ to Objects”是据直接对任意
IEnumerable 或 IEnumerable<T> 集合使用 LINQ 查询,无需用当中
LINQ 提供次要 API,如 LINQ to SQL 或 LINQ to XML。 可以采用 LINQ
来查询其他可枚举的聚集,如 List<T>、Array 或 Dictionary<TKey,
TValue>。 该集好是用户定义的汇,也得是 .NET Framework API
返回的聚众。

     从根本上说,LINQ to Objects
表示无异栽新的处理集合的方。
采用原始辙,您得编制指定如何从集合检索数据的繁杂的 foreach 循环。
而采取 LINQ 方法,您才待编写描述如找的始末之声明性代码。

     另外,与习俗的 foreach
循环相比,LINQ 查询所有三挺优势:

    • 它更明了、更易读,尤其在筛多个规格时。
    • 她采取最少的应用程序代码提供有力的筛选、排序和分组功能。
    • 毋庸改要仅仅需要做大有点之修改即可将它移植到其它数据源。

相关文章