.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
提供程序可用的任何其它格式的数目。

SQL Server 1

 

    • 拿到数据源

     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、马克斯、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" };
    • 匿名类型

SQL Server,   
 匿名类型由编译器构建,且项目名称只可用于编译器。匿名类型提供了一种在询问结果中暂时分组一组属性的便民方法,无需定义单独的命名类型。使用新的表明式和对象起先值设定项初步化匿名类型。

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

   
 扩大方法是一种可与类型涉及的静态方法,由此得以像实例方法这样对品种调用它。实际上,此功效使你可以将新办法“添加”到现有项目,而不会实际修改它们。标准查询运算符是一组扩张方法,它们为贯彻
IEnumerable<T> 的此外类型提供 LINQ 查询效能。

    • Lambda 表达式

     兰姆da
表明式是一种内联函数,该函数使用 =>
运算符将输入参数与函数体分离,并且可以在编译时转换为委托或发表式树。在
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,
电视alue>。 该集合可以是用户定义的聚众,也可以是 .NET Framework API
重返的成团。

     从根本上说,LINQ to Objects
表示一种新的拍卖集合的点子。
选取旧办法,您必须编制指定怎么着从集合检索数据的纷繁的 foreach 循环。
而利用 LINQ 方法,您只需编写描述要摸索的情节的注脚性代码。

     其它,与观念的 foreach
循环相比较,LINQ 查询所有三大优势:

    • 它们更分明、更易读,尤其在筛选五个原则时。
    • 它们利用最少的应用程序代码提供强有力的筛选、排序和分组效能。
    • 不用修改或只需做很小的改动即可将它们移植到此外数据源。

相关文章