• 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
提供次可用之另其它格式的数目。

XML 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、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 查询所有三特别优势:

    • 她更明确、更易读,尤其当筛多独标准化时。
    • 它运最少的应用程序代码提供强劲的淘、排序和分组功能。
    • 不用改或者单独需要开老有些的改动即可将她移植到另外数据源。

相关文章

网站地图xml地图