开班选择

走进 LINQ 的世界

走进 LINQ 的世界

[C#] 初阶应用 LINQ,

 

  在此以前曾公布过3篇关于 LINQ 的小说:

    进阶:《LINQ
标准查询操作概述》(强烈推荐)

    技巧:《Linq To Objects –
怎么着操作字符串》 和
《Linq To Objects –
怎么着操作文件目录》

  今后,自个儿打算再整理一篇关于 LINQ 入门的散文,也是呼之欲出的哦。

 

  以前曾发布过叁篇关于 LINQ 的小说:

    进阶:《LINQ
标准查询操作概述》(强烈推荐)

    技巧:《Linq To Objects –
怎么样操作字符串》 和
《Linq To Objects –
怎么样操作文件目录》

  今后,自个儿打算再整治1篇关于 LINQ 入门的小说,也是鲜活的哦。

 

千帆竞发应用 LINQ 

  从前曾公布过3篇有关 LINQ 的小说:

    进阶:《LINQ 标准查询操作概述》(强烈推荐)

    技巧:《Linq To Objects – 如何操作字符串》 和 《Linq To Objects

  • 何以操作文件目录》

  现在,本人打算再整理一篇关于 LINQ
入门的小说。为了防止篇幅过长,最终照旧选取将代码折叠起来。

  • LINQ

目录

  • LINQ 简介
  • 介绍 LINQ
    查询
  • LINQ
    基本查询操作
  • 动用 LINQ
    举行数据转换
  • LINQ
    查询操作的花色涉及
  • LINQ
    中的查询语法和方菲律宾语法

 

目录

  • LINQ 简介
  • 介绍 LINQ
    查询
  • LINQ
    基本查询操作
  • 动用 LINQ
    举办多少转换
  • LINQ
    查询操作的品种涉及
  • LINQ
    中的查询语法和章程语法

 

  语言集成查询 (LINQ) 是 Visual Studio 二零零六 和 .NET Framework 三.5版中引入的1项革新作用。

  古板上,针对数据的询问都是以简要的字符串表示,而从未编写翻译时类型检查或
英特尔liSense
辅助。其它,您还非得针对以下各个数据源学习1种分歧的查询语言:SQL
数据库、XML 文书档案、各个 Web 服务等等。 通过LINQ,
您能够利用语言关键字和纯熟的演算符针对强类型化对象集合编写查询。

美高梅开户网址 1

  

  在 Visual Studio 中,能够为以下数据源编写 LINQ 查询:SQL Server
数据库、XML 文书档案、ADO.NET
数据集,以及援救 IEnumerable 或泛型 IEnumerable<T> 接口的即兴对象集合。
  使用须要:项目 ≥ .NET Framework 3.五 。  

     语言集成查询 (LINQ) 是 Visual Studio
二零一零 中引进的一组效能,它在目的领域和多少领域之间架起了1座桥梁。可为
C# 和 Visual Basic 语言语法提供有力的询问功用。 LINQ
引进了专业、易学的多寡查询和更新方式,该技能能够扩张为差不多匡助别的类型的数量存款和储蓄。Visual
Studio 包罗 LINQ 提供程序的程序集,借助这一个程序集,就能将 LINQ 用于 .NET
Framework 集合、SQL Server 数据库、ADO.NET 数据集和 XML 文书档案。

LINQ 简介

  语言集成查询 (LINQ) 是 Visual Studio 2010 和 .NET Framework 三.5版中引进的1项立异作用。

  古板上,针对数据的询问都以以简要的字符串表示,而未有编写翻译时类型检查或
英特尔liSense
帮助。其余,您还非得针对以下各类数据源学习一种不一样的查询语言:SQL
数据库、XML 文书档案、各类 Web 服务等等。 通过LINQ,
您能够选拔语言关键字和熟练的演算符针对强类型化对象集合编写查询。

美高梅开户网址 2

  

  在 Visual Studio 中,能够为以下数据源编写 LINQ 查询:SQL Server
数据库、XML 文书档案、ADO.NET
数据集,以及支持 IEnumerable 或泛型 IEnumerable<T> 接口的4意对象集合。

  使用须要:项目 ≥ .NET Framework 三.5 。

 

LINQ 简介

  语言集成查询 (LINQ) 是 Visual Studio 二零一零 和 .NET Framework 3.5版中引进的一项立异功能。

  守旧上,针对数据的查询都以以简要的字符串表示,而并未有编写翻译时类型检查或
速龙liSense
帮忙。别的,您还必须针对以下各类数据源学习一种差别的询问语言:SQL
数据库、XML 文档、各样 Web 服务等等。 通过LINQ,
您能够接纳语言关键字和了然的运算符针对强类型化对象集合编写查询。

美高梅开户网址 3

  

  在 Visual Studio 中,能够为以下数据源编写 LINQ 查询:SQL Server
数据库、XML 文书档案、ADO.NET
数据集,以及援救 IEnumerable 或泛型 IEnumerable<T> 接口的即兴对象集合。

  使用供给:项目 ≥ .NET Framework 3.5 。

 

目录

  • 介绍 LINQ 查询
  • LINQ 基本查询操作
  • 使用 LINQ 举行多少转换
  • LINQ 查询操作的类型涉及
  • LINQ 中的查询语法和章程语法

 

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

一、介绍 LINQ 查询

  查询是壹种从数据源检索数据的表达式。随着岁月的推移,人们已经为种种数据源开发了分裂的言语;例如,用于关周详据库的
SQL 和用于 XML 的
XQuery。由此,开发职员不得不针对他们不能够不援助的每种数据源或数量格式而读书新的查询语言。LINQ
通过提供一种跨数据源和数量格式使用数据的等同模型,简化了那1意况。在
LINQ 查询中,始终会用到对象。可以运用同1的编码形式来询问和更换 XML
文书档案、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及对其有 LINQ
提供程序可用的任何别的格式的数量。  

 

一、介绍 LINQ 查询

  查询是壹种从数据源检索数据的表达式。随着岁月的推迟,人们壹度为种种数据源开发了不相同的言语;例如,用于关周到据库的
SQL 和用于 XML 的
XQuery。因而,开发职员不得不针对他们无法不支持的各个数据源或数量格式而读书新的查询语言。LINQ
通过提供一种跨数据源和数据格式使用数据的等同模型,简化了这一气象。在
LINQ 查询中,始终会用到目的。能够运用同壹的编码格局来查询和更换 XML
文书档案、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及对其有 LINQ
提供程序可用的任何其余格式的数码。  

 

一、介绍 LINQ 查询

  查询是1种从数据源检索数据的表明式。随着岁月的推移,人们早已为各样数据源开发了不相同的语言;例如,用于关周全据库的
SQL 和用来 XML 的
XQuery。因而,开发职员不得不针对他们必须援救的每一种数据源或数额格式而学习新的询问语言。LINQ
通过提供1种跨数据源和数码格式使用数据的1致模型,简化了那一情况。在
LINQ 查询中,始终会用到对象。能够选择同样的编码方式来询问和转换 XML
文书档案、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及对其有 LINQ
提供程序可用的别的其余格式的多少。  

     查询是1种从数据源检索数据的表达式。
查询普通用专门的询问语言来代表。
随着时间的推迟,人们早已为各类数据源开发了分化的言语;例如,用于关周详据库的
SQL 和用于 XML 的 XQuery。
由此,开发职员不得不针对他们无法不协助的每个数据源或数量格式而读书新的询问语言。
LINQ
通过提供1种跨各样数据源和数据格式使用数据的平等模型,简化了那1状态。
在 LINQ 查询中,始终会用到对象。 能够接纳同壹的基本编码格局来询问和转换
XML 文书档案、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及对其有 LINQ
提供程序可用的别的别的格式的数量。

  一.1 查询操作的两个部分

  操作三部曲:壹取多少源 二开立查询 三履行查询

美高梅开户网址 4美高梅开户网址 5

 1 internal class Program
 2 {
 3         private static void Main(string[] args)
 4         {
 5             //1.获取数据源
 6             var nums = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
 7 
 8             //2.创建查询
 9             var numQuery =
10                 from num in nums
11                 where (num % 2) == 0
12                 select num;
13 
14             //3.执行查询
15             foreach (var num in numQuery)
16             {
17                 Console.WriteLine("{0}", num);
18             }
19         }
20 }

View Code

美高梅开户网址 6

 

   下图体现了完整的查询操作。在 LINQ
中,查询的实践与查询本人截然差别;换句话说,查询本人指的是只开创查询变量,不检索任何数据。

美高梅开户网址 7

  

  一.一 查询操作的多少个部分

  操作三部曲:1取多少源 贰创办查询 三执行查询

美高梅开户网址 8美高梅开户网址 9

 1 internal class Program
 2 {
 3         private static void Main(string[] args)
 4         {
 5             //1.获取数据源
 6             var nums = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
 7 
 8             //2.创建查询
 9             var numQuery =
10                 from num in nums
11                 where (num % 2) == 0
12                 select num;
13 
14             //3.执行查询
15             foreach (var num in numQuery)
16             {
17                 Console.WriteLine("{0}", num);
18             }
19         }
20 }

View Code

美高梅开户网址 10

 

   下图呈现了完全的询问操作。在 LINQ
中,查询的实施与查询本身截然分化;换句话说,查询本人指的是只开创查询变量,不检索任何数据。

美高梅开户网址 11

  

  一.一 查询操作的五个部分

  操作3部曲:1取多少源 贰创制查询 叁实践查询

美高梅开户网址 12 1 internal
class Program 2 { 3 private static void Main(string[] args) 肆 { 5
//一.获取数据源 陆 var nums = new int[7] { 0, 一, 贰, 3, 4, 伍, 6 }; 7 8
//贰.开立查询 玖 var numQuery = 十 from num in nums 11 where (num % 二) ==
0 1二 select num; 1三 1四 //3.执行查询 15 foreach (var num in numQuery) 1陆{ 一7 Console.WriteLine(“{0}”, num); 1八 } 1九 } 20 } View Code

美高梅开户网址 13

 

   下图彰显了1体化的询问操作。在 LINQ
中,查询的实施与查询自个儿截然分化;换句话说,查询本身指的是只开创查询变量,不检索任何数据。

美高梅开户网址 14

  

美高梅开户网址 15

  1.2 数据源

  在上五个示范中,由于数据源是数组,由此它隐式扶助泛型 IEnumerable<T> 接口。支持 IEnumerable<T> 或派生接口(如泛型 IQueryable<T>)的品类称为可查询类型。  

  可查询类型不须求开始展览修改或独特处理就足以用作 LINQ
数据源。假使源数据还尚未当做可查询类型出现在内部存款和储蓄器中,则 LINQ
提供程序必须以此形式表示源数据。例如,LINQ to XML 将 XML
文档加载到可查询的 XElement 类型中:

  //从 XML 中创建数据源
  //using System.Xml.Linq;
  var contacts = XElement.Load(@"c:\xxx.xml");

  

  在 LINQ to SQL 中,首先需求创设对象关系映射。
针对这么些目的编排查询,然后由 LINQ to SQL 在运转时处理与数据库的通信。

美高梅开户网址 16美高梅开户网址 17

1     var  db = new Northwnd(@"c:\northwnd.mdf");
2     
3     //查询在伦敦的客户
4     var custQuery =
5         from cust in db.Customers
6         where cust.City == "London"
7         select cust;

Customers 代表数据库中的特定表

 

开班选择。  1.2 数据源

  在上1个演示中,由于数据源是数组,因而它隐式协助泛型 IEnumerable<T> 接口。支持 IEnumerable<T> 或派生接口(如泛型 IQueryable<T>)的品类称为可查询类型。  

  可查询类型不供给展开修改或特种处理就能够用作 LINQ
数据源。假诺源数据还一直不作为可查询类型出现在内部存款和储蓄器中,则 LINQ
提供程序必须以此格局意味着源数据。例如,LINQ to XML 将 XML
文书档案加载到可查询的 XElement 类型中:

  //从 XML 中创建数据源
  //using System.Xml.Linq;
  var contacts = XElement.Load(@"c:\xxx.xml");

  

  在 LINQ to SQL 中,首先供给成立对象关系映射。
针对那么些目的编排查询,然后由 LINQ to SQL 在运营时处理与数据库的通信。

美高梅开户网址 18美高梅开户网址 19

1     var  db = new Northwnd(@"c:\northwnd.mdf");
2     
3     //查询在伦敦的客户
4     var custQuery =
5         from cust in db.Customers
6         where cust.City == "London"
7         select cust;

Customers 代表数据库中的特定表

 

  1.2 数据源

  在上三个演示中,由于数据源是数组,由此它隐式帮助泛型 IEnumerable<T> 接口。支持 IEnumerable<T> 或派生接口(如泛型 IQueryable<T>)的类小名为可查询类型。
 

  可查询类型不需求展开改动或独特处理就足以用作 LINQ
数据源。要是源数据还不曾当做可查询类型出现在内存中,则 LINQ
提供程序必须以此方法表示源数据。例如,LINQ to XML 将 XML
文书档案加载到可查询的 XElement 类型中:

  //从 XML 中创建数据源
  //using System.Xml.Linq;
  var contacts = XElement.Load(@"c:\xxx.xml");

  

  在 LINQ to SQL 中,首先须要创制对象关系映射。
针对这几个指标编排查询,然后由 LINQ to SQL 在运维时处理与数据库的通讯。

美高梅开户网址 201 var db =
new Northwnd(@”c:\northwnd.mdf”); 二 三 //查询在London的客户 四 var
custQuery = 5 from cust in db.Customers 陆 where cust.City == “伦敦” 七select cust; Customers 表示数据库中的特定表

 

 

  1.3 查询

  查询钦命要从数据源中检索的音信。
查询还是能够钦点在回去那些音信在此之前怎么样对其展开排序、分组和结构化。
查询存款和储蓄在查询变量中,并用查询说明式举办早先化。

  此前的以身作则中的查询是从整数数组中回到全体的偶数。
该查询表明式包涵三个子句:fromwhere 和 select。(假诺你熟识SQL,您会小心到那么些子句的逐条与 SQL
中的顺序相反。)from 子句钦定数据源,where 子句内定应用筛选器,select 子句钦命重返的要素的种类。
最近内需留意的是,在 LINQ 中,查询变量本人不执行其余操作并且不回去任何数据。
它只是存款和储蓄在后来某些时刻执行查询时为浮动结果而须要的音讯。

 

  1.3 查询

  查询钦定要从数据源中检索的音讯。
查询还足以内定在回到这几个新闻此前如何对其进行排序、分组和结构化。
查询存款和储蓄在询问变量中,并用查询表达式进行初阶化。

  从前的言传身教中的查询是从整数数组中回到全数的偶数。
该查询表明式包罗三个子句:fromwhere 和 select。(假诺您了然SQL,您会注意到这一个子句的依次与 SQL
中的顺序相反。)from 子句钦点数据源,where 子句钦点应用筛选器,select 子句钦赐重返的要素的花色。
近年来亟需留意的是,在 LINQ 中,查询变量自个儿不实施其余操作并且不回去任何数据。
它只是存款和储蓄在之后有些时刻执行查询时为变化结果而供给的新闻。

 

  1.3 查询

  查询钦命要从数额源中检索的音讯。
查询还足以钦赐在再次来到那么些音信在此之前怎么样对其进展排序、分组和结构化。
查询存款和储蓄在询问变量中,并用查询表达式进行先导化。

  此前的言传身教中的查询是从整数数组中回到全体的偶数。
该查询表明式包括八个子句:fromwhere 和 select。(借使您了然SQL,您会注意到那几个子句的次第与 SQL
中的顺序相反。)from 子句钦命数据源,where 子句钦定应用筛选器,select 子句钦点重返的因素的类型。
近来内需小心的是,在 LINQ
中,查询变量本人不实施此外操作并且不回去任何数据。
它只是存款和储蓄在后头有个别时刻执行查询时为浮动结果而须求的新闻。  

    • 收获数据源

  一.四 查询执行

  壹.四 查询执行

  壹.四 查询执行

     LINQ语句是在 foreach
语句中推行查询,而 foreach 要求使用 IEnumerable 或
IEnumerable<T>。匡助 IEnumerable<T> 或派生接口(如泛型
IQueryable<T>)的门类称为“可查询类型”。

  一.延迟执行

    如前所述,查询变量自个儿只是存款和储蓄查询命令。  实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时发出。
此概念称为“延迟执行”。

  一.延缓执行

    如前所述,查询变量自个儿只是存款和储蓄查询命令。  实际的询问执行会延迟到在 foreach 语句中循环访问查询变量时爆发。
此概念称为“延迟执行”。

  1.推迟执行

    如前所述,查询变量本人只是存款和储蓄查询命令。  实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时产生。
此概念称为“延迟执行”。

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

  二.强制立刻施行

    对壹层层源成分执行聚合函数的询问必须首先循环访问这几个要素。CountMaxAverage 和 First 就属于此类查询。由于查询自身必须选择 foreach 以便回到结果,因而那一个查询在实践时不使用显式 foreach 语句。其余还要小心,那一个类其余查询重返单个值,而不是 IEnumerable 集合。 

美高梅开户网址 21美高梅开户网址 22

1     var numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
2 
3     var evenNumQuery =
4         from num in numbers
5         where (num % 2) == 0
6         select num;
7 
8     var evenNumCount = evenNumQuery.Count();

View Code

美高梅开户网址 23

 

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

美高梅开户网址 24美高梅开户网址 25

1     var numQuery2 =
2            (from num in numbers
3             where (num % 2) == 0
4             select num).ToList();
5 
6     var numQuery3 =
7           (from num in numbers
8            where (num % 2) == 0
9             select num).ToArray();

View Code

 

  其余,仍是能够通过在紧跟查询表达式之后的地方放置二个 foreach 循环来强制执行查询。不过,通过调用 ToList 或 ToArray,也得以将装有数据缓存在单个集合对象中。 

 

  二.威逼立即施行

    对壹星罗棋布源元素执行聚合函数的询问必须首先循环访问那个成分。CountMaxAverage 和 First 就属于此类查询。由于查询自个儿必须利用 foreach 以便回到结果,因而那个查询在执行时不采取显式 foreach 语句。其它还要注意,那几个项指标询问重返单个值,而不是 IEnumerable 集合。 

美高梅开户网址 26美高梅开户网址 27

1     var numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
2 
3     var evenNumQuery =
4         from num in numbers
5         where (num % 2) == 0
6         select num;
7 
8     var evenNumCount = evenNumQuery.Count();

View Code

美高梅开户网址 28

 

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

美高梅开户网址 29美高梅开户网址 30

1     var numQuery2 =
2            (from num in numbers
3             where (num % 2) == 0
4             select num).ToList();
5 
6     var numQuery3 =
7           (from num in numbers
8            where (num % 2) == 0
9             select num).ToArray();

View Code

 

  别的,还足以由此在紧跟查询表明式之后的职位放置贰个 foreach 循环来强制执行查询。然则,通过调用 ToList 或 ToArray,也得以将持有数据缓存在单个集合对象中。 

 

  二.胁制立时施行

    对壹密密麻麻源成分执行聚合函数的询问必须首先循环访问这个成分。CountMaxAverage 和 First 就属于此类查询。由于查询本身必须使用 foreach 以便回到结果,因而这个查询在履行时不利用显式 foreach 语句。其它还要小心,这几个品种的询问重回单个值,而不是 IEnumerable 集合。 

美高梅开户网址 311 var
numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; 2 3 var evenNumQuery = 4
from num in numbers 5 where (num % 2) == 0 6 select num; 7 8 var
evenNumCount = evenNumQuery.Count(); View Code

1 var numQuery2 = 2 (from num in numbers 3 where (num % 2) == 0 4 select
num).ToList(); 5 6 var numQuery3 = 7 (from num in numbers 8 where (num %
2) == 0 9 select num).ToArray(); View Code

 

  此外,还可以通过在紧跟查询表明式之后的地方放置2个 foreach 循环来强制执行查询。然而,通过调用 ToList 或 ToArray,也可以将兼具数据缓存在单个集合对象中。 

 

    • 始建查询

②、基本 LINQ 查询操作

2、基本 LINQ 查询操作

二、基本 LINQ 查询操作

     查询钦定要从数量源中检索的新闻。查询还能钦命在再次回到那些音信在此以前怎么样对其进展排序、分组和结构化。查询存款和储蓄在查询变量中,并用查询表达式进行起头化。

  二.一 获取数据源:from

  在 LINQ
查询中,第1步是点名数据源。像在大部编制程序语言中相同,必须先证明变量,才能应用它。在
LINQ 查询中,初步使用 from 子句的指标是引进数据源和限制变量。

美高梅开户网址 32美高梅开户网址 33

1     //queryAllCustomers 是 IEnumerable<Cutsomer> 类型
2     //数据源 (customers) 和范围变量 (cust)
3     var queryAllCustomers = from cust in customers
4                                            select cust;

View Code

  范围变量类似于 foreach 循环中的迭代变量,但在查询表达式中,实际上不爆发迭代。执行查询时,范围变量将用作对 customers 中的种种后续成分的引用。因为编写翻译器可以测算 cust 的档次,所以你不用显式钦赐此类型。

 

  二.一 获取数据源:from

  在 LINQ
查询中,第3步是钦定数据源。像在超过一半编制程序语言中一样,必须先注明变量,才能采纳它。在
LINQ 查询中,伊始使用 from 子句的指标是引进数据源和限制变量。

美高梅开户网址 34美高梅开户网址 35

1     //queryAllCustomers 是 IEnumerable<Cutsomer> 类型
2     //数据源 (customers) 和范围变量 (cust)
3     var queryAllCustomers = from cust in customers
4                                            select cust;

View Code

  范围变量类似于 foreach 循环中的迭代变量,但在查询表明式中,实际上不爆发迭代。执行查询时,范围变量将用作对 customers 中的种种后续成分的引用。因为编写翻译器能够推论 cust 的项目,所以你不用显式钦点此类型。

 

  贰.一 获取数据源:from

  在 LINQ
查询中,第三步是钦赐数据源。像在大多数编制程序语言中平等,必须先注脚变量,才能选用它。在
LINQ 查询中,起头使用 from 子句的指标是引入数据源和限制变量。

美高梅开户网址 361
//queryAllCustomers 是 IEnumerable<Cutsomer> 类型 2 //数据源
(customers) 和限制变量 (cust) 3 var queryAllCustomers = from cust in
customers 四 select cust; View
Code

  范围变量类似于 foreach 循环中的迭代变量,但在询问表明式中,实际上不发生迭代。执行查询时,范围变量将用作对 customers 中的各样后续成分的引用。因为编写翻译器可以想见 cust 的花色,所以你不用显式钦点此类型。

 

    • 推行查询
      • 延期执行

  2.2 筛选:where

  可能最常用的询问操作是接纳布尔表明式方式的筛选器。此筛选器使查询只回去那么些表明式结果为
true 的因素。使用 where 子句生成结果。实际上,筛选器钦定从源系列中清除哪些要素。

美高梅开户网址 37美高梅开户网址 38

1     var queryLondonCustomers = from cust in customers
2                                   where cust.City = "London"
3                                     select cust;

只回去地址位于London的 customers。

  您可以利用深谙的 C#
逻辑 AND(&&)和 OR(||) 运算符来根据须求在 where 子句中选拔任意数量的筛选表达式。 

美高梅开户网址 39美高梅开户网址 40

where cust.City = "London" && cust.Name = "Devon"

若要只回去位于“London”和姓名字为“Devon”的客户

美高梅开户网址 41美高梅开户网址 42

where cust.City = "London" || cust.Name = "Paris"

若要再次回到位于London或法国首都的客户

 

  2.2 筛选:where

  只怕最常用的询问操作是选择布尔表明式格局的筛选器。此筛选器使查询只回去这个表明式结果为
true 的要素。使用 where 子句生成结果。实际上,筛选器钦定从源种类中排除哪些要素。

美高梅开户网址 43美高梅开户网址 44

1     var queryLondonCustomers = from cust in customers
2                                   where cust.City = "London"
3                                     select cust;

只回去地址位于London的 customers。

  您能够运用深谙的 C#
逻辑 AND(&&)和 OR(||) 运算符来依据必要在 where 子句中使用任意数量的筛选表达式。 

美高梅开户网址 45美高梅开户网址 46

where cust.City = "London" && cust.Name = "Devon"

若要只回去位于“London”和姓名称叫“Devon”的客户

美高梅开户网址 47美高梅开户网址 48

where cust.City = "London" || cust.Name = "Paris"

若要再次来到位于London或法国首都的客户

 

  2.2 筛选:where

  或然最常用的查询操作是利用布尔表明式情势的筛选器。此筛选器使查询只回去那多少个表明式结果为
true
的成分。使用 where 子句生成结果。实际上,筛选器钦赐从源连串中化解哪些因素。

美高梅开户网址 49一 var
queryLondonCustomers = from cust in customers 二        where
cust.City = “London” 三       select cust; 只回去地址位于London的 customers。

  您能够使用深谙的 C#
逻辑 AND(&&)和 OR(||) 运算符来依据需求在 where 子句中运用任意数量的筛选表明式。 

美高梅开户网址 50where
cust.City = “London” && cust.Name = “Devon” 若要只回去位于“London”和人名称为“Devon”的客户
美高梅开户网址 51where
cust.City = “London” || cust.Name = “Paris” 若要回去位于London或法国首都的客户

 

   
 查询变量本人只是存款和储蓄查询命令。实际的查询执行会延迟到在 foreach
语句中循环访问查询变量时发生。此概念称为“延迟执行”

  2.3 排序:orderby

  平常能够很便利地将重返的多寡实行排序。orderby 子句将使再次回到的行列中的成分遵照被排序的种类的暗中认可比较器进行排序。

美高梅开户网址 52美高梅开户网址 53

1     var queryLondonCustomers = from cust in customers
2                                where cust.City = "London"
3                                orderby cust.Name descending 
4                                select cust;

按 Name 属性对结果开始展览排序

  因为 Name 是一个字符串,所以暗中认可相比器执行从 A 到 Z
的字母排序。若要按相反顺序(从 Z 到 A)对结果开始展览排序,请使用 orderby…descending 子句。

 

  2.3 排序:orderby

  经常能够很便利地将赶回的数码实行排序。orderby 子句将使重回的行列中的成分依据被排序的种类的暗中同意比较器举办排序。

美高梅开户网址 54美高梅开户网址 55

1     var queryLondonCustomers = from cust in customers
2                                where cust.City = "London"
3                                orderby cust.Name descending 
4                                select cust;

按 Name 属性对结果开始展览排序

  因为 Name 是三个字符串,所以默许相比较器执行从 A 到 Z
的假名排序。若要按相反顺序(从 Z 到 A)对结果实行排序,请使用 orderby…descending 子句。

 

  2.3 排序:orderby

  平时能够很便利地将再次回到的数量开始展览排序。orderby 子句将使重回的队列中的成分遵照被排序的类别的暗中同意相比器实行排序。

美高梅开户网址 56一 var
queryLondonCustomers = from cust in customers 二 where cust.City =
“London” 3 orderby cust.Name descending 4 select cust; 按 Name 属性对结果实行排序

  因为 Name 是三个字符串,所以暗中同意相比较器执行从 A 到 Z
的字母排序。若要按相反顺序(从 Z 到 A)对结果开始展览排序,请使用 orderby…descending 子句。

 

foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}

  2.4 分组:group

  使用 group 子句,您能够按钦命的键分组结果。

美高梅开户网址 57美高梅开户网址 58

 1     var queryLondonCustomers = from cust in customers
 2                     group cust by cust.City;
 3 
 4     foreach (var queryLondonCustomer in queryLondonCustomers)
 5     {
 6        Console.WriteLine(queryLondonCustomer.Key);
 7        foreach (var cust in queryLondonCustomer)
 8        {
 9           Console.WriteLine(cust.Name);
10        }
11     }

你能够钦命结果应按 City
分组,以便位于London或法国巴黎的有着客户位于各自组中。

  在本例中,cust.City 是键。

  在使用 group 子句停止查询时,结果使用列表的列表方式。列表中的各样成分是八个颇具 Key 成员及依据该键分组的因素列表的目的。在循环访问生成组连串的询问时,您必须使用嵌套的 foreach 循环。外部循环用于循环访问每种组,内部循环用于循环访问每种组的积极分子。
 

  尽管你必须引用组操作的结果,能够应用 into 关键字来创设可进一步查询的标识符。

美高梅开户网址 59美高梅开户网址 60

1     //custQuery 是 IEnumable<IGrouping<string, Customer>> 类型
2     var custQuery = from cust in customers
3                     group cust by cust.City
4                     into custGroup
5                     where custGroup.Count() > 2
6                     orderby custGroup.Key
7                     select custGroup;

此处的询问只回去那一个富含多个以上的客户的组。

 

  2.4 分组:group

  使用 group 子句,您能够按钦点的键分组结果。

美高梅开户网址 61美高梅开户网址 62

 1     var queryLondonCustomers = from cust in customers
 2                     group cust by cust.City;
 3 
 4     foreach (var queryLondonCustomer in queryLondonCustomers)
 5     {
 6        Console.WriteLine(queryLondonCustomer.Key);
 7        foreach (var cust in queryLondonCustomer)
 8        {
 9           Console.WriteLine(cust.Name);
10        }
11     }

您能够钦赐结果应按 City
分组,以便位于London或法国首都的持有客户位于各自己组建中。

  在本例中,cust.City 是键。

  在使用 group 子句停止查询时,结果使用列表的列表格局。列表中的各类成分是1个兼有 Key 成员及依据该键分组的要素列表的靶子。在循环访问生成组连串的查询时,您必须使用嵌套的 foreach 循环。外部循环用于循环访问每一个组,内部循环用于循环访问每一种组的分子。
 

  要是你必须引用组操作的结果,能够行使 into 关键字来创立可进一步查询的标识符。

美高梅开户网址 63美高梅开户网址 64

1     //custQuery 是 IEnumable<IGrouping<string, Customer>> 类型
2     var custQuery = from cust in customers
3                     group cust by cust.City
4                     into custGroup
5                     where custGroup.Count() > 2
6                     orderby custGroup.Key
7                     select custGroup;

那里的询问只回去那多少个富含多个以上的客户的组。

 

  2.4 分组:group

  使用 group 子句,您能够按内定的键分组结果。

美高梅开户网址 65 一 var
query伦敦Customers = from cust in customers 二 group cust by cust.City;
三 四 foreach (var queryLondonCustomer in queryLondonCustomers) 五 { 陆Console.WriteLine(queryLondonCustomer.Key); 7 foreach (var cust in
queryLondonCustomer) 八 { 九 Console.WriteLine(cust.Name); 10 } 1一 } 您能够钦命结果应按 City
分组,以便位于London或时尚之都的拥有客户位于各自己组建中。

  在本例中,cust.City 是键。

  在使用 group 子句甘休查询时,结果运用列表的列表形式。列表中的各种成分是三个有所 Key 成员及基于该键分组的成分列表的对象。在循环访问生成组系列的询问时,您必须采纳嵌套的 foreach 循环。外部循环用于循环访问每种组,内部循环用于循环访问每一个组的分子。
 

  若是您必须引用组操作的结果,能够动用 into 关键字来创制可进一步询问的标识符。

美高梅开户网址 661
//custQuery 是 IEnumable<IGrouping<string, Customer>> 类型 贰var custQuery = from cust in customers 3 group cust by cust.City 四 into
custGroup 5 where custGroup.Count() > 贰 6 orderby custGroup.Key 7select custGroup; 那里的询问只回去这1个带有四个以上的客户的组。

 

      • 强制立即执行

  2.5 联接:join

  联接运算创设数量源中未有显式建立模型的行列之间的涉及。例如,您可以推行联接来寻找位于同一地点的具备客户和经销商。在
LINQ 中,join 子句始终对准对象集合而非直接指向数据库表运营。  

美高梅开户网址 67美高梅开户网址 68

1     var innerJoinQuery = from cust in customers
2                        join dist in distributors on cust.City equals dist.City
3                        select new {CustomerName = cust.Name, DistributorName = dist.Name};

比如,您能够执行联接来探寻位于同一地方的具有客户和经销商。

  在 LINQ 中,join 子句始终本着对象集合而非直接指向数据库表运维。
 

  在 LINQ 中,您不用像在 SQL 中那么往往利用 join,因为 LINQ
中的外键在对象模型中象征为带有项集合的个性。

美高梅开户网址 69美高梅开户网址 70

    from order in Customer.Orders...

例如,Customer 对象涵盖 Order
对象的集聚。不必执行联接,只需使用点表示法访问订单。

  

  2.5 联接:join

  联接运算成立数量源中未有显式建立模型的行列之间的涉及。例如,您能够推行联接来查找位于同一地点的具有客户和经销商。在
LINQ 中,join 子句始终本着对象集合而非直接指向数据库表运转。  

美高梅开户网址 71美高梅开户网址 72

1     var innerJoinQuery = from cust in customers
2                        join dist in distributors on cust.City equals dist.City
3                        select new {CustomerName = cust.Name, DistributorName = dist.Name};

比如说,您能够实施联接来搜寻位于同一地方的拥有客户和经销商。

  在 LINQ 中,join 子句始终本着对象集合而非直接针对数据库表运维。
 

  在 LINQ 中,您不要像在 SQL 中那样频仍使用 join,因为 LINQ
中的外键在目的模型中意味为带有项集合的性质。

美高梅开户网址 73美高梅开户网址 74

    from order in Customer.Orders...

诸如,Customer 对象涵盖 Order
对象的汇聚。不必执行联接,只需使用点表示法访问订单。

  

  2.5 联接:join

  联接运算创制数量源中未有显式建立模型的行列之间的关联。例如,您能够执行联接来寻觅位于同1地点的兼具客户和经销商。在
LINQ 中,join 子句始终本着对象集合而非直接针对数据库表运行。  

美高梅开户网址 75一 var
innerJoinQuery = from cust in customers 2   join dist in distributors
on cust.City equals dist.City 3   select new {CustomerName =
cust.Name, DistributorName = dist.Name}; 例如,您能够推行联接来寻觅位于同1地址的装有客户和经销商。

  在 LINQ 中,join 子句始终对准对象集合而非直接指向数据库表运转。
 

  在 LINQ 中,您不用像在 SQL 中那样频仍使用 join,因为 LINQ
中的外键在指标模型中表示为带有项集合的习性。

美高梅开户网址 76 from order
in Customer.Orders… 例如,Customer
对象涵盖 Order
对象的集结。不必执行联接,只需使用点表示法访问订单。

  

   
 对1多级源成分执行聚合函数的询问必须首先循环访问这几个因素。
Count、马克斯、Average 和 First 就属于此类查询。由于查询本身必须采纳foreach 以便回到结果,因此那几个查询在履行时不选取显式 foreach
语句。其余还要小心,这么些项指标查询重临单个值,而不是 IEnumerable
集合。

  2.6 选择(投影):select

  select 子句生成查询结果并钦赐每一种重返的要素的“形状”或项目。

  例如,您能够钦定结果包罗的是全方位 Customer 对象、仅3个分子、成员的子集,依旧有些基于计算或新对象创造的通通两样的结果类型。当 select 子句生成除源成分副本以外的内容时,该操作称为“投影”。

 

  2.6 选择(投影):select

  select 子句生成查询结果并钦命各类重回的要素的“形状”或项目。

  例如,您能够钦赐结果包罗的是全部 Customer 对象、仅三个分子、成员的子集,依然有个别基于计算或新对象创立的完全不相同的结果类型。当 select 子句生成除源成分副本以外的剧情时,该操作称为“投影”。

 

  2.6 选择(投影):select

  select 子句生成查询结果并点名各个再次来到的成分的“形状”或项目。

  例如,您能够内定结果包涵的是壹切 Customer 对象、仅一个成员、成员的子集,照旧有些基于总括或新目的成立的完全分化的结果类型。当 select 子句生成除源成分副本以外的故事情节时,该操作称为“投影”。

 

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

三、使用 LINQ 进行多少转换

  语言集成查询 (LINQ)
不仅可用来检索数据,而且如故3个功效强大的多寡转换工具。通过接纳 LINQ
查询,您可以将源种类用作输入,并使用二种情势修改它以成立新的输出系列。您可以由此排序和分组来修改该系列,而不用修改成分本人。然而,LINQ
查询的最有力的功力是能够创制新品类。这一意义在 select 子句中完结。 例如,能够执行下列职责:  

  

叁、使用 LINQ 进行多少转换

  语言集成查询 (LINQ)
不仅可用来检索数据,而且依旧三个作用强大的数额转换工具。通过利用 LINQ
查询,您能够将源系列用作输入,并接纳三种办法修改它以创建新的输出连串。您能够经过排序和分组来修改该种类,而不用修改成分自己。可是,LINQ
查询的最有力的机能是力所能及创制新类型。那一成效在 select 子句中贯彻。 例如,能够实行下列职务:  

  

3、使用 LINQ 实行多少转换

  语言集成查询 (LINQ)
不仅可用以检索数据,而且依然贰个功能强大的多少转换工具。通过采取 LINQ
查询,您能够将源类别用作输入,并应用种种形式修改它以创建新的输出类别。您能够透过排序和分组来修改该种类,而不要修改成分自己。但是,LINQ
查询的最强大的职能是力所能及成立新类型。这一意义在 select 子句中贯彻。 例如,能够执行下列职责:  

  

   
 若要强制马上施行任意查询并缓存其结果,能够调用 ToList<TSource> 或
ToArray<TSource> 方法。

  3.壹 将三个输入联接到3个出口类别

美高梅开户网址 77美高梅开户网址 78

 1     class Student
 2     {
 3         public string Name { get; set; }
 4 
 5         public int Age { get; set; }
 6 
 7         public string City { get; set; }
 8 
 9         public List<int> Scores { get; set; }
10     }
11 
12     class Teacher
13     {
14         public int Id { get; set; }
15 
16         public string Name { get; set; }
17 
18         public int Age { get; set; }
19 
20         public string City { get; set; }
21 
22     }

学生和师资四个类

美高梅开户网址 79美高梅开户网址 80

 1     internal class Program
 2     {
 3         private static void Main(string[] args)
 4         {
 5             //创建第一个数据源
 6             var students = new List<Student>()
 7             {
 8                 new Student()
 9                 {
10                     Age = 23,
11                     City = "广州",
12                     Name = "小C",
13                     Scores = new List<int>(){85,88,83,97}
14                 },
15                 new Student()
16                 {
17                     Age = 18,
18                     City = "广西",
19                     Name = "小明",
20                     Scores = new List<int>(){86,78,85,90}
21                 },
22                 new Student()
23                 {
24                     Age = 33,
25                     City = "梦里",
26                     Name = "小叁",
27                     Scores = new List<int>(){86,68,73,97}
28                 }
29             };
30 
31             //创建第二个数据源
32             var teachers = new List<Teacher>()
33             {
34                 new Teacher()
35                 {
36                     Age = 35,
37                     City = "梦里",
38                     Name = "啵哆"
39                 },
40                 new Teacher()
41                 {
42                     Age = 28,
43                     City = "云南",
44                     Name = "小红"
45                 },
46                 new Teacher()
47                 {
48                     Age = 38,
49                     City = "河南",
50                     Name = "丽丽"
51                 }
52             };
53 
54             //创建查询
55             var peopleInDreams = (from student in students
56                             where student.City == "梦里"
57                             select student.Name)
58                             .Concat(from teacher in teachers
59                                     where teacher.City == "梦里"
60                                     select teacher.Name);
61 
62             //执行查询
63             foreach (var person in peopleInDreams)
64             {
65                 Console.WriteLine(person);
66             }
67 
68             Console.Read();
69         }
70     }

控制台出口代码。   

 

  三.1 将四个输入联接到叁个出口体系

美高梅开户网址 81美高梅开户网址 82

 1     class Student
 2     {
 3         public string Name { get; set; }
 4 
 5         public int Age { get; set; }
 6 
 7         public string City { get; set; }
 8 
 9         public List<int> Scores { get; set; }
10     }
11 
12     class Teacher
13     {
14         public int Id { get; set; }
15 
16         public string Name { get; set; }
17 
18         public int Age { get; set; }
19 
20         public string City { get; set; }
21 
22     }

学员和老师多个类

美高梅开户网址 83美高梅开户网址 84

 1     internal class Program
 2     {
 3         private static void Main(string[] args)
 4         {
 5             //创建第一个数据源
 6             var students = new List<Student>()
 7             {
 8                 new Student()
 9                 {
10                     Age = 23,
11                     City = "广州",
12                     Name = "小C",
13                     Scores = new List<int>(){85,88,83,97}
14                 },
15                 new Student()
16                 {
17                     Age = 18,
18                     City = "广西",
19                     Name = "小明",
20                     Scores = new List<int>(){86,78,85,90}
21                 },
22                 new Student()
23                 {
24                     Age = 33,
25                     City = "梦里",
26                     Name = "小叁",
27                     Scores = new List<int>(){86,68,73,97}
28                 }
29             };
30 
31             //创建第二个数据源
32             var teachers = new List<Teacher>()
33             {
34                 new Teacher()
35                 {
36                     Age = 35,
37                     City = "梦里",
38                     Name = "啵哆"
39                 },
40                 new Teacher()
41                 {
42                     Age = 28,
43                     City = "云南",
44                     Name = "小红"
45                 },
46                 new Teacher()
47                 {
48                     Age = 38,
49                     City = "河南",
50                     Name = "丽丽"
51                 }
52             };
53 
54             //创建查询
55             var peopleInDreams = (from student in students
56                             where student.City == "梦里"
57                             select student.Name)
58                             .Concat(from teacher in teachers
59                                     where teacher.City == "梦里"
60                                     select teacher.Name);
61 
62             //执行查询
63             foreach (var person in peopleInDreams)
64             {
65                 Console.WriteLine(person);
66             }
67 
68             Console.Read();
69         }
70     }

支配台出口代码。   

 

  3.一 将多个输入联接到2个出口系列

美高梅开户网址 85 一 class
Student 二 { 3 public string Name { get; set; } 四 伍 public int Age { get;
set; } 6 七 public string City { get; set; } 八 玖 public List<int>
Scores { get; set; } 10 } 1一 1二 class Teacher 一三 { 1四 public int Id {
get; set; } 一伍 1陆 public string Name { get; set; } 17 1捌 public int Age
{ get; set; } 1九 20 public string City { get; set; } 二一 2二 } 学生和教授七个类
美高梅开户网址 86 1 internal
class Program 2 { 3 private static void Main(string[] args) 四 { 5
//创设第3个数据源 陆 var students = new List<Student>() 7 { 八 new
Student() 九 { 10 Age = 二三, 11 City = “苏黎世”, 12 Name = “小C”, 1叁 Scores
= new List<int>(){八伍,8八,八三,9柒} 1肆 }, 1五 new Student() 1陆 { 一七 Age
= 1八, 1八 City = “新疆”, 1九 Name = “小明”, 20 Scores = new
List<int>(){86,7八,八五,90} 贰一 }, 2二 new Student() 二③ { 二肆 Age = 3三,
2五 City = “梦之中”, 二陆 Name = “小三”, 二7 Scores = new
List<int>(){捌陆,6八,7三,9七} 28 } 2玖 }; 30 3一 //成立第四个数据源 3二var teachers = new List<Teacher>() 3叁 { 3四 new Teacher() 35 { 36Age = 35, ③7 City = “梦中”, 3八 Name = “啵哆” 3玖 }, 40 new Teacher() 肆一 {
4二 Age = 2八, 4三 City = “湖南”, 4四 Name = “小红” 四伍 }, 四6 new Teacher()
47 { 4八 Age = 3八, 4九 City = “江西”, 50 Name = “丽丽” 5一 } 5二 }; 伍三 54
//创立查询 5五 var peopleInDreams = (from student in students 56 where
student.City == “梦之中” 5柒 select student.Name) 5八 .Concat(from teacher
in teachers 5九 where teacher.City == “梦之中” 60 select teacher.Name); 61
6二 //执行查询 陆三 foreach (var person in peopleInDreams) 6肆 { 65Console.WriteLine(person); 6陆 } 67 6八 Console.Read(); 6九 } 70 } 控制台出口代码。

美高梅开户网址 87

 

List<int> numQuery2 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToList();

  3.二 选取各类源成分的子集

  一. 若要只选拔源成分的三个成员,请使用点运算。

1     var query = from cust in Customers
2                     select cust.City;

  

  2. 若要制造包罗源成分的四个脾气的要素,能够应用具有命名对象或匿名类型的靶子开头值设定项。

1     var query = from cust in Customer
2                    select new {Name = cust.Name, City = cust.City};

 

  3.二 选取各种源成分的子集

  一. 若要只选拔源成分的三个成员,请使用点运算。

1     var query = from cust in Customers
2                     select cust.City;

  

  贰. 若要创立包蕴源成分的多少个特性的因素,能够运用全体命名对象或匿名类型的指标起初值设定项。

1     var query = from cust in Customer
2                    select new {Name = cust.Name, City = cust.City};

 

  三.2 选用各个源成分的子集

  一. 若要只选择源成分的二个分子,请使用点运算。

1     var query = from cust in Customers
2                     select cust.City;

  

  二. 若要创制包罗源成分的多个属性的成分,能够采用具有命名对象或匿名类型的对象开始值设定项。

1     var query = from cust in Customer
2                    select new {Name = cust.Name, City = cust.City};

 

  • 支持 LINQ 的功能
    • 查询表明式

  三.三 将内部存储器中的靶子转换为 XML

美高梅开户网址 88美高梅开户网址 89

 1             //创建数据源
 2             var students = new List<Student>()
 3             {
 4                 new Student()
 5                 {
 6                     Age = 18,
 7                     Name = "小A",
 8                     Scores = new List<int>() {88,85,74,66 }
 9                 },
10                 new Student()
11                 {
12                     Age = 35,
13                     Name = "小B",
14                     Scores = new List<int>() {88,85,74,66 }
15                 },
16                 new Student()
17                 {
18                     Age = 28,
19                     Name = "小啥",
20                     Scores = new List<int>() {88,85,74,66 }
21                 }
22             };
23 
24             //创建查询
25             var studentsToXml = new XElement("Root",
26                 from student in students
27                 let x = $"{student.Scores[0]},{student.Scores[1]},{student.Scores[2]},{student.Scores[3]}"
28                 select new XElement("student",
29                 new XElement("Name", student.Name),
30                 new XElement("Age", student.Age),
31                 new XElement("Scores", x))
32             );
33 
34             //执行查询
35             Console.WriteLine(studentsToXml);

View Code

美高梅开户网址 90

 

  3.叁 将内部存款和储蓄器中的指标转换为 XML

美高梅开户网址 91美高梅开户网址 92

 1             //创建数据源
 2             var students = new List<Student>()
 3             {
 4                 new Student()
 5                 {
 6                     Age = 18,
 7                     Name = "小A",
 8                     Scores = new List<int>() {88,85,74,66 }
 9                 },
10                 new Student()
11                 {
12                     Age = 35,
13                     Name = "小B",
14                     Scores = new List<int>() {88,85,74,66 }
15                 },
16                 new Student()
17                 {
18                     Age = 28,
19                     Name = "小啥",
20                     Scores = new List<int>() {88,85,74,66 }
21                 }
22             };
23 
24             //创建查询
25             var studentsToXml = new XElement("Root",
26                 from student in students
27                 let x = $"{student.Scores[0]},{student.Scores[1]},{student.Scores[2]},{student.Scores[3]}"
28                 select new XElement("student",
29                 new XElement("Name", student.Name),
30                 new XElement("Age", student.Age),
31                 new XElement("Scores", x))
32             );
33 
34             //执行查询
35             Console.WriteLine(studentsToXml);

View Code

美高梅开户网址 93

 

  三.三 将内部存款和储蓄器中的指标转换为 XML

美高梅开户网址 94 1
//创制数量源 二 var students = new List<Student>() 三 { 四 new
Student() 伍 { 6 Age = 1八, 七 Name = “小A”, 捌 Scores = new
List<int>() {8八,八5,7四,66 } 玖 }, 10 new Student() 1壹 { 12 Age = 35,
一三 Name = “小B”, 14 Scores = new List<int>() {8八,8五,7四,66 } 一5 },
1陆 new Student() 一七 { 1八 Age = 2八, 1九 Name = “小吗”, 20 Scores = new
List<int>() {8八,85,7四,6陆 } 二一 } 2贰 }; 贰三 二四 //创造查询 二五 var
studentsToXml = new XElement(“Root”, 贰6 from student in students 二七 let
x =
$”{student.Scores[0]},{student.Scores[1]},{student.Scores[2]},{student.Scores[3]}”
2八 select new XElement(“student”, 2玖 new XElement(“Name”, student.Name),
30 new XElement(“Age”, student.Age), 31 new XElement(“Scores”, x)) 32 );
3三 3四 //执行查询 35 Console.WriteLine(studentsToXml); View Code

美高梅开户网址 95

 

     查询表明式使用类似于 SQL 或 XQuery
的注脚性语法来查询 IEnumerable 集合。在编译时,查询语法转换为对 LINQ
提供程序的正规化查询运算符扩充方法完结的格局调用。应用程序通过行使 using
指令钦定适当的命名空间来支配范围内的正式查询运算符。上面包车型大巴查询表达式获取一个字符串数组,按字符串中的第二个字符对字符串进行分组,然后对各组实行排序。

  3.4 对源成分执行操作

  输出系列可能不带有源类别的任何因素或因素属性。输出恐怕是透过将源成分用作输入参数计算出的值的队列。

美高梅开户网址 96美高梅开户网址 97

 1             //数据源
 2             double[] radii = {1, 2, 3};
 3 
 4             //创建查询
 5             var query = from radius in radii
 6                 select $"{radius * radius * 3.14}";
 7 
 8             //执行查询
 9             foreach (var i in query)
10             {
11                 Console.WriteLine(i);
12             }

View Code

美高梅开户网址 98

   【备注】$”{radius
* radius * 3.14}” 相当于 string.Format(“{0}”,radius * radius *
3.1四),那里运用的是 C# 6.0 的语法。

 

  三.四 对源成分执行操作

  输出体系或然不分包源类别的别样因素或因素属性。输出大概是通过将源成分用作输入参数总结出的值的行列。

美高梅开户网址 99美高梅开户网址 100

 1             //数据源
 2             double[] radii = {1, 2, 3};
 3 
 4             //创建查询
 5             var query = from radius in radii
 6                 select $"{radius * radius * 3.14}";
 7 
 8             //执行查询
 9             foreach (var i in query)
10             {
11                 Console.WriteLine(i);
12             }

View Code

美高梅开户网址 101

   【备注】$”{radius
* radius * 3.14}” 相当于 string.Format(“{0}”,radius * radius *
叁.1肆),那里运用的是 C# 6.0 的语法。

 

  三.四 对源成分执行操作

  输出系列或然不带有源系列的其余因素或因素属性。输出大概是透过将源成分用作输入参数总括出的值的行列。

美高梅开户网址 102 1 //数据源
2 double[] radii = {一, 二, 叁}; 3 4 //创立查询 5 var query = from radius
in radii 6 select $”{radius * radius * 叁.14}”; 7 ⑧ //执行查询 9foreach (var i in query) 十 { 11 Console.WriteLine(i); 1二 } View Code

美高梅开户网址 103

 

var query = from str in stringArray
            group str by str[0] into stringGroup
            orderby stringGroup.Key
            select stringGroup;

四、LINQ 查询操作的门类涉及

  LINQ
查询操作在数据源、查询本身及查询执行中是强类型的。查询中变量的档次必须与数据源二月素的类别和 foreach 语句中迭代变量的类型包容。强类型能够确定保障在编写翻译时捕获类型错误,以便及时订正。

 

4、LINQ 查询操作的档次涉及

  LINQ
查询操作在数据源、查询自个儿及查询执行中是强类型的。查询中变量的类型必须与数据源兰月素的门类和 foreach 语句中迭代变量的花色包容。强类型能够保险在编写翻译时捕获类型错误,以便及时勘误。

 

4、LINQ 查询操作的品类涉及

  LINQ
查询操作在数据源、查询本身及查询执行中是强类型的。查询中变量的花色必须与数据源七月素的档次和 foreach 语句中迭代变量的类型包容。此强类型保险在编写翻译时捕获类型错误,以便能够在用户蒙受这个错误以前考订它们。

 

    • 隐式类型化变量

  4.1 不转换源数据的询问

  下图演示不对数据进行转换的 LINQ to Objects
查询操作。源蕴涵叁个字符串种类,查询输出也是一个字符串系列。 

美高梅开户网址 104

  一数据源的品类参数决定限制变量的品类。

  二抉择的对象的品种决定查询变量的花色。此处的 name 为1个字符串。由此,查询变量是两个 IEnumerable<字符串>。
 

  ③在 foreach 语句中循环访问查询变量。因为查询变量是一个字符串系列,所以迭代变量也是1个字符串。
 

 

  四.一 不转换源数据的询问

  下图演示不对数据实行转换的 LINQ to Objects
查询操作。源包蕴2个字符串类别,查询输出也是三个字符串种类。 

美高梅开户网址 105

  1数据源的项目参数决定限制变量的品种。

  贰精选的对象的种类决定查询变量的种类。此处的 name 为1个字符串。由此,查询变量是二个 IEnumerable<字符串>。
 

  ③在 foreach 语句中循环访问查询变量。因为查询变量是三个字符串连串,所以迭代变量也是三个字符串。
 

 

  四.1 不转换源数据的查询

  下图演示不对数据实施转换的 LINQ to Objects
查询操作。源包蕴1个字符串类别,查询输出也是1个字符串体系。 

美高梅开户网址 106

  (壹)数据源的体系参数决定限制变量的品类。

  (2)选取的对象的品种决定查询变量的品种。此处的 name 为多少个字符串。因而,查询变量是三个 IEnumerable<字符串>。
 

  (3)在 foreach 语句中循环访问查询变量。因为查询变量是二个字符串连串,所以迭代变量也是一个字符串。
 

 

   
 不必在注解并初叶化变量时显式钦命项目,您能够选取 var
修饰符来提醒编写翻译器推测并分配项目,注脚为 var
的变量与显式钦定其体系的变量壹样都以强类型。通过应用
var,能够创立匿名类型,但它可用于其余部分变量。也能够选择隐式类型表明数组。

  四.二 转换源数据的查询

  下图演示对数码实行简单转换的 LINQ to
SQL 查询操作。查询将3个 Customer 对象系列用作输入,并只选取结果中的 Name 属性。因为 Name 是3个字符串,所以查询生成四个字符串连串作为出口。  

美高梅开户网址 107

  1数据源的门类参数决定限制变量的项目。

  ②select 语句再次来到 Name 属性,而非完整的 Customer 对象。因为 Name 是三个字符串,所以 custNameQuery 的体系参数是 string,而非Customer。
 

  叁因为 custNameQuery 是二个字符串种类,所以 foreach 循环的迭代变量也亟须是 string

 

  下图演示另1种转移。select 语句重回只捕获原始 Customer 对象的多个成员的匿名类型。

美高梅开户网址 108

  壹数据源的品种参数始终为查询中的范围变量的花色。

美高梅开户网址 ,  2因为 select 语句生成匿名类型,所以必须选择 var 隐式类型化查询变量。

  三因为查询变量的项目是隐式的,所以 foreach 循环中的迭代变量也不可能不是隐式的。

 

  四.贰 转换源数据的查询

  下图演示对数据进行简单转换的 LINQ to
SQL 查询操作。查询将3个 Customer 对象体系用作输入,并只选拔结果中的 Name 属性。因为 Name 是三个字符串,所以查询生成1个字符串系列作为出口。  

美高梅开户网址 109

  1数据源的类型参数决定限制变量的门类。

  ②select 语句重返 Name 属性,而非完整的 Customer 对象。因为 Name 是二个字符串,所以 custNameQuery 的档次参数是 string,而非Customer。
 

  3因为 custNameQuery 是1个字符串类别,所以 foreach 循环的迭代变量也不可能不是 string

 

  下图演示另1种转移。select 语句再次回到只捕获原始 Customer 对象的多个分子的匿名类型。

美高梅开户网址 110

  一数据源的门类参数始终为查询中的范围变量的项目。

  贰因为 select 语句生成匿名类型,所以必须接纳 var 隐式类型化查询变量。

  三因为查询变量的类型是隐式的,所以 foreach 循环中的迭代变量也务必是隐式的。

 

  四.2 转换源数据的询问

  下图演示对数据实施不难转换的 LINQ to
SQL 查询操作。查询将贰个 Customer 对象连串用作输入,并只选拔结果中的 Name 属性。因为 Name 是一个字符串,所以查询生成八个字符串系列作为出口。  

美高梅开户网址 111

  (1)数据源的连串参数决定限制变量的种类。

  (2)select 语句重回 Name 属性,而非完整的 Customer 对象。因为 Name 是3个字符串,所以 custNameQuery 的品种参数是 string,而非Customer。
 

  (三)因为 custNameQuery 是一个字符串种类,所以 foreach 循环的迭代变量也非得是 string

 

  下图演示另壹种转移。select 语句再次来到只捕获原始 Customer 对象的三个分子的匿名类型。

美高梅开户网址 112

  (一)数据源的类型参数始终为查询中的范围变量的项目。

  (二)因为 select 语句生成匿名类型,所以必须使用 var 隐式类型化查询变量。

  (3)因为查询变量的门类是隐式的,所以 foreach 循环中的迭代变量也非得是隐式的。

 

var number = 5;
var name = "Virginia";
var query = from str in stringArray
            where str[0] == 'm'
            select str;

  四.三 让编写翻译器猜测类型消息

  您也得以选择首要字 var,可用来查询操作中的任何部分变量。不过,编写翻译器为查询操作中的各种变量提供强类型。  

美高梅开户网址 113

 

  4.三 让编写翻译器估算类型音信

  您也得以选择首要字 var,可用来查询操作中的任何部分变量。可是,编写翻译器为查询操作中的各样变量提供强类型。  

美高梅开户网址 114

 

  4.三 让编写翻译器猜想类型音信

  您也足以选拔让编写翻译器为您执行总体做事。关键字 var 可用于查询操作中的任何部分变量。可是,编写翻译器为查询操作中的各种变量提供强类型。  

美高梅开户网址 115

 

    • 指标和集合开头值设定项

5、LINQ 中的查询语法和办罗马尼亚(România)语法

  我们编辑的 LINQ 查询语法,在编写翻译代码时,CL奇骏会将查询语法转换为艺术语法。这一个艺术调用标准查询运算符的名目类似 WhereSelectGroupByJoinMax和 Average,大家也是能够直接行使那一个点子语法的。
 

  查询语法和措施语英语义相同,不过,许多少人员发现查询语法更简便易行、更便于阅读。有个别查询必须代表为艺术调用。例如,必须利用办法调用表示检索成分的多寡与钦命的标准的查询。还非得运用方法需求摸索成分的最大值在源连串的查询。System.Linq 命名空间中的标准查询运算符的参阅文档常常使用方斯洛伐克共和国(The Slovak Republic)语法。

 

伍、LINQ 中的查询语法和方爱沙尼亚语法

  我们编辑的 LINQ 查询语法,在编写翻译代码时,CL卡宴会将查询语法转换为方式语法。那一个格局调用标准查询运算符的名称类似 WhereSelectGroupByJoinMax和 Average,我们也是足以向来运用那几个主意语法的。
 

  查询语法和章程语希腊语义相同,然而,许几个人手发现查询语法更简明、更易于阅读。有个别查询必须代表为格局调用。例如,必须使用方法调用表示检索成分的多寡与钦点的规则的询问。还非得利用情势供给寻找成分的最大值在源类别的询问。System.Linq 命名空间中的标准查询运算符的参阅文书档案经常采取办乌克兰语法。

 

5、LINQ 中的查询语法和艺术语法

  在象征语言集成查询 (LINQ) 使用 LINQ
性查询语法,文书档案中的多数询问编写。不过,编写翻译代码时,必须将查询语法转换为艺术,那就需求.NET 公共语言运维时
(CL奥迪Q5)。那个办法调用标准查询运算符的名称类似 WhereSelectGroupByJoinMax和 Average。能够调用那么些格局间接行使格局语法而不是询问语法。
 

  查询语法和方式语英语义相同,但是,许两人口发现查询语法更不难、更便于阅读。某个查询必须代表为方式调用。例如,必须选择格局调用表示检索成分的数额与钦定的标准化的询问。还必须选拔办法需求寻找成分的最大值在源种类的询问。System.Linq 命名空间中的标准查询运算符的参阅文档平时采纳办马耳他语法。

 

   
 通过对象和集合初步值设定项,开首化对象时无需为对象显式调用构造函数。开首值设定项普通用在将源数据投影到新数据类型的查询表明式中。假定3个类名称叫Customer,具有公共 Name 和 Phone
属性,能够按下列代码中所示使用对象起先值设定项:

  五.壹 标准查询运算符扩大方法

美高梅开户网址 116美高梅开户网址 117

 1         static void Main(string[] args)
 2         {
 3             var nums = new int[4] { 1, 2, 3, 4 };
 4             
 5             //创建查询表达式
 6             var qureyNums = from n in nums
 7                             where n % 2 == 0
 8                             orderby n descending
 9                             select n;
10 
11             Console.WriteLine("qureyNums:");
12             foreach (var n in qureyNums)
13             {
14                 Console.WriteLine(n);
15             }
16     
17             //使用方法进行查询
18             var queryNums2 = nums.Where(n => n % 2 == 0).OrderByDescending(n => n);
19 
20             Console.WriteLine("qureyNums2:");
21             foreach (var n in queryNums2)
22             {
23                 Console.WriteLine(n);
24             }
25 
26             Console.Read();
27         }

上边包车型客车演示演示简单的询问表明式和编排为基于方法的查询的语义上等效的询问。

美高梅开户网址 118

  多个示范的输出是相同的。您能够看到两种方式的询问变量的体系是同一的:IEnumerable<T>。
 

  若要驾驭基于方法的询问,让我们尤其地剖析它。注意,在表明式的左侧,where 子句今后意味着为对 numbers 对象的实例方法,在您再也调用该对象时其项目为 IEnumerable<int>。如若您熟知泛型 IEnumerable<T> 接口,那么你就会精晓,它不富有 Where 方法。可是,要是你在
Visual Studio IDE 中调用 AMDliSense
实现列表,那么您不只将看到 Where 方法,而且还会看出不可胜计别样措施,如 SelectSelectManyJoin 和Orderby。上边是负有正式查询运算符。 

美高梅开户网址 119

  尽管看起来 IEnumerable<T> 就像是已被再次定义以囊括这个附加措施,但实际并非如此。那些标准查询运算符都以用作“扩展方法”完结的。

 

  五.一 标准查询运算符扩充方法

美高梅开户网址 120美高梅开户网址 121

 1         static void Main(string[] args)
 2         {
 3             var nums = new int[4] { 1, 2, 3, 4 };
 4             
 5             //创建查询表达式
 6             var qureyNums = from n in nums
 7                             where n % 2 == 0
 8                             orderby n descending
 9                             select n;
10 
11             Console.WriteLine("qureyNums:");
12             foreach (var n in qureyNums)
13             {
14                 Console.WriteLine(n);
15             }
16     
17             //使用方法进行查询
18             var queryNums2 = nums.Where(n => n % 2 == 0).OrderByDescending(n => n);
19 
20             Console.WriteLine("qureyNums2:");
21             foreach (var n in queryNums2)
22             {
23                 Console.WriteLine(n);
24             }
25 
26             Console.Read();
27         }

上面包车型大巴言传身教演示简单的查询表明式和编辑为遵照方法的询问的语义上等效的查询。

美高梅开户网址 122

  八个示范的出口是平等的。您可以看来二种样式的查询变量的档次是千篇一律的:IEnumerable<T>。
 

  若要精通基于方法的询问,让我们越发地解析它。注意,在表明式的左边,where 子句今后表示为对 numbers 对象的实例方法,在你再度调用该对象时其种类为 IEnumerable<int>。假设你熟知泛型 IEnumerable<T> 接口,那么您就会驾驭,它不有所 Where 方法。可是,如若你在
Visual Studio IDE 中调用 英特尔liSense
实现列表,那么您不仅将见到 Where 方法,而且还会看到众多其余办法,如 SelectSelectManyJoin 和Orderby。上边是拥有正规查询运算符。 

美高梅开户网址 123

  就算看起来 IEnumerable<T> 就如已被重复定义以囊括这几个附加措施,但骨子里并非如此。那个专业查询运算符都以当做“扩大方法”达成的。

 

  伍.一 标准查询运算符扩张方法

美高梅开户网址 124 1 static
void Main(string[] args) 2 { 3 var nums = new int[4] { 1, 贰, 3, 四 };
肆 伍 //创设查询表明式 6 var qureyNums = from n in nums 7 where n % 二 == 0
8 orderby n descending 九 select n; 拾 1一Console.WriteLine(“qureyNums:”); 1二 foreach (var n in qureyNums) 一三 { 14
Console.WriteLine(n); 一伍 } 1陆 一7 //应用办法开始展览查询 18 var queryNums二 =
nums.Where(n => n % 二 == 0).OrderByDescending(n => n); 1玖 20
Console.WriteLine(“qureyNums二:”); ②一 foreach (var n in queryNums二) 2二 {
2三 Console.WriteLine(n); 24 } 25 26 Console.Read(); 二七 } 上面包车型客车示范演示简单的查询表明式和编写制定为依照方法的询问的语义上等效的查询。

美高梅开户网址 125

  四个示范的输出是一模1样的。您能够看出三种情势的查询变量的花色是如出一辙的:IEnumerable<T>。
 

  若要驾驭基于方法的询问,让我们更为地解析它。注意,在表达式的出手,where 子句未来表示为对 numbers 对象的实例方法,在您再也调用该对象时其系列为 IEnumerable<int>。如若您熟谙泛型 IEnumerable<T> 接口,那么你就会询问,它不享有 Where 方法。可是,假如你在
Visual Studio IDE 中调用 AMDliSense
完毕列表,那么您不只将见到 Where 方法,而且还会看出不少其余艺术,如 SelectSelectManyJoin 和Orderby。上面是颇具标准查询运算符。 

美高梅开户网址 126

  尽管看起来 IEnumerable<T> 如同已被再次定义以囊括那么些附加措施,但实际上并非如此。那些标准查询运算符都以用作“扩大方法”实现的。

 

Customer cust = new Customer { Name = "Mike", Phone = "555-1212" };

  5.2 Lambda 表达式

  在前方的以身作则中,布告该规则发挥式 (num % 二 == 0) 是作为内联参数。Where 方法:Where(num
=> num % 贰 == 0) 此内联表达式称为 lambda
表达式。将代码编写为匿名格局或泛型委托或表明式树是一种方便人民群众的主意,不然编写起来就要麻烦得多。=> 是
lambda 运算符,可读为“goes
to”。运算符左边的 num 是输入变量,与查询表达式中的 num 相对应。编写翻译器可预计 num 的门类,因为它明白 numbers 是泛型 IEnumerable<T> 类型。lambda
说明式与查询语法中的表明式或任何此外 C#
表达式或语句中的表明式相同;它能够包含方法调用和别的复杂逻辑。“重临值”正是表达式结果。
 

 

  5.2 Lambda 表达式

  在日前的示范中,布告该规范发挥式 (num % 二 == 0) 是作为内联参数。Where 方法:Where(num
=> num % 二 == 0) 此内联表明式称为 lambda
表明式。将代码编写为匿名格局或泛型委托或表明式树是一种便利的办法,否则编写起来就要麻烦得多。=> 是
lambda 运算符,可读为“goes
to”。运算符右侧的 num 是输入变量,与查询表明式中的 num 相对应。编写翻译器可估量 num 的档次,因为它明白 numbers 是泛型 IEnumerable<T> 类型。lambda
表明式与查询语法中的表明式或其余其余 C#
表明式或语句中的表达式相同;它能够包含方法调用和其余复杂逻辑。“再次回到值”正是表明式结果。
 

 

  5.2 Lambda 表达式

  在前边的示范中,布告该规则发挥式 (num % 二 == 0)
是作为内联参数。Where 方法:Where(num => num % 贰 == 0)
此内联表达式称为 lambda
表达式。将代码编写为匿名格局或泛型委托或表明式树是1种方便人民群众的不贰秘诀,否则编写起来就要麻烦得多。=> 是
lambda 运算符,可读为“goes
to”。运算符左边的 num 是输入变量,与查询表明式中的 num 相对应。编写翻译器可猜想 num 的连串,因为它掌握 numbers 是泛型 IEnumerable<T> 类型。lambda
表明式与查询语法中的表明式或别的别的 C#
表明式或语句中的表达式相同;它能够总结方法调用和任何复杂逻辑。“重回值”便是表明式结果。
 

 

    • 匿名类型

  伍.三 查询的组合性

  在上边的代码示例中,请小心 OrderBy 方法是透过在对 Where 的调用中使用点运算符来调用的。Where 生成筛选种类,然后 Orderby 通过对该体系排序来对它实行操作。因为查询会重回 IEnumerable,所以你可通过将艺术调用链接在联合署名,在方式语法少校这么些查询组合起来。那正是在您通过选拔查询语法编写查询时编写翻译器在后台所举行的操作。并且鉴于查询变量不存款和储蓄查询的结果,由此你能够随时修改它或将它用作新查询的基本功,就算在实施它后。

 

  伍.三 查询的组合性

  在上头的代码示例中,请小心 OrderBy 方法是通过在对 Where 的调用中采纳点运算符来调用的。Where 生成筛选系列,然后 Orderby 通过对该类别排序来对它实行操作。因为查询会重返 IEnumerable,所以您可经过将艺术调用链接在壹块,在艺术语法少将这么些查询组合起来。这正是在您通过运用查询语法编写查询时编写翻译器在后台所推行的操作。并且鉴于查询变量不存款和储蓄查询的结果,由此你能够每天修改它或将它用作新查询的底蕴,尽管在履行它后。

 

  五.三 查询的组合性

  在地点的代码示例中,请留心 OrderBy 方法是通过在对 Where 的调用中利用点运算符来调用的。Where 生成筛选类别,然后 Orderby 通过对该体系排序来对它实行操作。因为查询会再次回到 IEnumerable,所以您可经过将艺术调用链接在一块儿,在章程语法中将那一个查询组合起来。这正是在您通过选取查询语法编写查询时编写翻译器在后台所进行的操作。并且鉴于查询变量不存款和储蓄查询的结果,因而你能够随时修改它或将它用作新查询的基本功,就算在举办它后。

 

正文首联:

 

–待整理形成后重新发布到首页–

  

] 开头选择 LINQ, 起始接纳 LINQ
以前曾刊登过三篇关于 LINQ 的小说: 进阶:《LINQ 标准查询操作概述》
(强烈推荐) 技巧:《Linq…

   
 匿名类型由编译器构建,且项目名称只可用以编写翻译器。匿名类型提供了壹种在查询结果中权且分组1组属性的便宜方法,无需定义单独的命名类型。使用新的表明式和目的开端值设定项初阶化匿名类型。

传送门

  入门:《走进 LINQ
的世界》

  进阶:《LINQ
标准查询操作概述》(强烈推荐)

  技巧:《Linq To Objects –
怎么着操作字符串》 和
《Linq To Objects –
如何操作文件目录》

 

 


正文首联:

【参考】

【来源】本文引用部分微软官方文书档案的图片

 

 

  

传送门

  入门:《走进 LINQ
的世界》

  进阶:《LINQ
标准查询操作概述》(强烈推荐)

  技巧:《Linq To Objects –
怎么样操作字符串》 和
《Linq To Objects –
如何操作文件目录》

 

 


本文首联:

【参考】

【来源】本文引用部分微软官方文书档案的图样

 

 

  

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

   
 扩张方法是一种可与体系涉及的静态方法,因而能够像实例方法那样对品种调用它。实际上,此功能使你能够将新格局“添加”到存活项目,而不会实际修改它们。标准查询运算符是1组扩张方法,它们为落到实处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
关键字很有用。平常,大家建议1旦你使用
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 查询全部叁大优势:

    • 它们更醒目、更易读,尤其在筛选多少个标准时。
    • 它们选用最少的应用程序代码提供强有力的筛选、排序和分组成效。
    • 无需修改或只需做不大的修改即可将它们移植到其余数据源。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图