bob体育app[C#] 开始使用 LINQ,

2019-12-12 23:52栏目:bob体育平台
TAG:

走进 LINQ 的世界

[C#] 早前使用 LINQ,

  在此之前曾发布过三篇有关 LINQ 的小说:

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

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

  未来,本人绸缪再整合治理生龙活虎篇有关 LINQ 入门的小说,也是心如刀割的啊。

 

伊始使用 LINQ 

  早先曾刊登过三篇有关 LINQ 的小说:

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

    本事:《Linq To Objects - 怎么着操作字符串》 和 《Linq To Objects

  • 什么样操作文件目录》

  以后,自个儿希图再整合治理生机勃勃篇有关 LINQ 入门的小说。为了幸免篇幅过长,最终依然筛选将代码折叠起来。

目录

  • LINQ 简介
  • 介绍 LINQ 查询
  • LINQ 基本查询操作
  • 应用 LINQ 举办数量转变
  • LINQ 查询操作的类型涉及
  • LINQ 中的查询语法和章程语法

 

  语言集成查询 (LINQ卡塔尔国 是 Visual Studio 二零零六 和 .NET Framework 3.5 版中引进的豆蔻梢头项修改功效。

  古板上,针对数据的询问都以以简要的字符串表示,而并未有编译时类型检查或 AMDliSense 协理。别的,您还非得针对以下各个数据源学习生龙活虎种分化的查询语言:SQL 数据库、XML 文书档案、种种 Web 服务等等。 通过LINQ, 您能够行使语言关键字和熟识的运算符针对强类型化对象集结编写查询。

bob体育app 1

  

  在 Visual Studio 中,可感到以下数据源编写 LINQ 查询:SQL Server 数据库、XML 文书档案、ADO.NET 数据集,以致帮忙 IEnumerable 或泛型 IEnumerable<T> 接口的即兴对象会集。   使用要求:项目 ≥ .NET Framework 3.5 。  

LINQ 简介

  语言集成查询 (LINQ卡塔尔国 是 Visual Studio 二〇一〇 和 .NET Framework 3.5 版中引入的黄金年代项修正功效。

  古板上,针对数据的询问都以以简要的字符串表示,而从不编译时类型检查或 AMDliSense 匡助。别的,您还非得针对以下各个数据源学习生龙活虎种分化的查询语言:SQL 数据库、XML 文书档案、种种 Web 服务等等。 通过LINQ, 您能够使用语言关键字和熟练的演算符针对强类型化对象集结编写查询。

bob体育app 2

  

  在 Visual Studio 中,可认为以下数据源编写 LINQ 查询:SQL Server 数据库、XML 文档、ADO.NET 数据集,以至援助 IEnumerable 或泛型 IEnumerable<T> 接口的自便对象集结。

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

 

目录

  • 介绍 LINQ 查询
  • LINQ 基本查询操作
  • 应用 LINQ 进行多少调换
  • LINQ 查询操作的类型涉及
  • LINQ 中的查询语法和方German法

 

一、介绍 LINQ 查询

  查询是大器晚成种从数据源检索数据的表达式。随着年华的延期,大家曾经为各样数据源开辟了分裂的言语;举例,用于关全面据库的 SQL 和用于 XML 的 XQuery。由此,开垦职员一定要针对他们一定要帮忙的各类数据源或数量格式而学习新的询问语言。LINQ 通过提供大器晚成种跨数据源和数量格式使用数据的平等模型,简化了那意气风发状态。在 LINQ 查询中,始终会用到目标。能够动用相近的编码方式来查询和转移 XML 文书档案、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以致对其有 LINQ 提供程序可用的其余此外格式的数码。  

 

一、介绍 LINQ 查询

  查询是生龙活虎种从数据源检索数据的表明式。随着时间的推迟,大家早已为各类数据源开辟了分化的言语;举个例子,用于关周密据库的 SQL 和用于 XML 的 XQuery。因而,开采职员必须要针对他们不得不协助的种种数据源或数量格式而读书新的查询语言。LINQ 通过提供意气风发种跨数据源和数码格式使用数据的等同模型,简化了这一气象。在 LINQ 查询中,始终会用到指标。能够运用同生龙活虎的编码情势来查询和转移 XML 文书档案、SQL 数据库、ADO.NET 数据集、.NET 集结中的数据以至对其有 LINQ 提供程序可用的其它其余格式的数额。  

  1.1 查询操作的七个部分

  操作三部曲:①取多少源 ②创办查询 ③推行查询

bob体育app 3bob体育app 4

 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

bob体育app 5

 

   下图显示了完整的查询操作。在 LINQ 中,查询的施行与查询本人天壤之别;换句话说,查询自身指的是只开创查询变量,不检索任何数据。

bob体育app 6

  

  1.1 查询操作的四个部分

  操作三部曲:①取多少源 ②创立查询 ③奉行查询

bob体育app 7 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

bob体育app 8

 

   下图显示了整机的查询操作。在 LINQ 中,查询的实践与查询本身判若两人;换句话说,查询本人指的是只开创查询变量,不检索任何数据。

bob体育app 9

  

  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 在运作时管理与数据库的通讯。

bob体育app 10bob体育app 11

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 在运作时管理与数据库的通讯。

bob体育app 121 var db = new Northwnd(@"c:northwnd.mdf"卡塔尔; 2 3 //查询在London的客商 4 var custQuery = 5 from cust in db.Customers 6 where cust.City == "London" 7 select cust; Customers 表示数据库中的特定表

 

  1.3 查询

  查询钦定要从数额源中检索的音信。 查询还足以钦点在回到那些音信在此以前如何对其实行排序、分组和构造化。 查询存款和储蓄在询问变量中,并用查询说明式实行伊始化。

  在此之前的亲自过问中的查询是从整数数组中回到全数的偶数。 该查询表明式包括多个子句:fromwhere 和 select。(若是你熟练SQL,您会专一到那几个子句的逐一与 SQL 中的顺序相反。)from 子句钦命数据源,where 子句钦定应用筛选器,select 子句内定再次来到的成分的项目。 近来亟待在乎的是,在 LINQ 中,查询变量本人不试行别的操作并且不回来任何数据。 它只是存款和储蓄在其后某些时刻实践查询时为转换结果而供给的消息。

 

  1.3 查询

  查询钦点要从数据源中检索的音讯。 查询还是能够内定在回到这么些音信此前怎么样对其打开排序、分组和布局化。 查询存款和储蓄在查询变量中,并用查询表达式举行初阶化。

  此前的亲自去做中的查询是从整数数组中回到全部的偶数。 该查询表明式富含五个子句:fromwhere 和 select。(假设您熟练SQL,您会注意到那些子句的各类与 SQL 中的顺序相反。)from 子句钦点数据源,where 子句钦赐应用筛选器,select 子句钦点再次来到的因素的体系。 近日内需注意的是,在 LINQ 中,查询变量本身不实践别的操作况兼不回去任何数据。 它只是存款和储蓄在这里后某些时刻实行查询时为浮动结果而须求的消息。  

  1.4 查询实行

  1.4 查询施行

  1.延缓实践

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

  1.推迟试行

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

  2.威逼立即试行

    对生龙活虎层层源成分实践聚合函数的询问必得首先循环访谈那些元素。CountMaxAverage 和 First 就归属此类查询。由于查询自己必得利用 foreach 以便回到结果,由此那个查询在实行时不接受显式 foreach 语句。其它还要注意,那一个类其他询问重返单个值,实际不是 IEnumerable 集合。 

bob体育app 13bob体育app 14

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

bob体育app 15

 

  若要强制立时推行大肆查询并缓存其结果,能够调用 ToList<TSource> 或 ToArray<TSource> 方法。

bob体育app 16bob体育app 17

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,也得以将有着数据缓存在单个集合对象中。 

 

  2.威逼马上实行

    对意气风发层层源成分推行聚合函数的询问必需首先循环访谈这几个成分。CountMaxAverage 和 First 就归于此类查询。由于查询本身必需选用 foreach 以便回到结果,因而这一个查询在实行时不接纳显式 foreach 语句。别的还要小心,那个项指标询问再次来到单个值,并不是 IEnumerable 集合。 

bob体育app 181 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

 

  此外,还是能由此在紧跟查询表明式之后的职分放置一个 foreach 循环来强逼实践查询。可是,通过调用 ToList 或 ToArray,也得以将享有数据缓存在单个集结对象中。 

 

二、基本 LINQ 查询操作

二、基本 LINQ 查询操作

  2.1 获取数据源:from

  在 LINQ 查询中,第一步是点名数据源。像在非常多编制程序语言中相近,必得先评释变量,工夫利用它。在 LINQ 查询中,最初使用 from 子句的指标是引进数据源和限量变量。

bob体育app 19bob体育app 20

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

View Code

  范围变量近似于 foreach 循环中的迭代变量,但在查询表明式中,实际上不发生迭代。履行查询时,范围变量将用作对 customers 中的每一个后续成分的援用。因为编写翻译器可以测算 cust 的门类,所以您不要显式钦定此类型。

 

  2.1 获取数据源:from

  在 LINQ 查询中,第一步是点名数据源。像在大部编制程序语言中豆蔻梢头律,必得先注脚变量,本领运用它。在 LINQ 查询中,最早使用 from 子句的目标是引进数据源和节制变量。

bob体育app 211 //queryAllCustomers 是 IEnumerable<Cutsomer> 类型 2 //数据源 (customers卡塔尔 和约束变量 (cust卡塔尔(قطر‎ 3 var queryAllCustomers = from cust in customers 4 select cust; View Code

  范围变量肖似于 foreach 循环中的迭代变量,但在询问表达式中,实际上不发出迭代。实施查询时,范围变量将用作对 customers 中的每一种后续成分的引用。因为编写翻译器能够预计 cust 的门类,所以您不要显式内定此类型。

 

  2.2 筛选:where

  也许最常用的询问操作是使用布尔表明式情势的筛选器。此筛选器使查询只回去这么些表达式结果为 true 的成分。使用 where 子句生成结果。实际上,筛选器钦赐从源连串中打消哪些因素。

bob体育app 22bob体育app 23

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

只回去地址坐落于London的 customers。

  您能够选择深谙的 C# 逻辑 AND(&&)和 OR(||) 运算符来依照供给在 where 子句中采用放肆数量的筛选表达式。 

bob体育app 24bob体育app 25

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

若要只回去位于“London”和人名称为“Devon”的客商

bob体育app 26bob体育app 27

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

若要重返坐落于London或法国首都的顾客

 

  2.2 筛选:where

  大概最常用的询问操作是行使布尔表明式方式的筛选器。此筛选器使查询只回去那个表明式结果为 true 的要素。使用 where 子句生成结果。实际上,挑选器钦命从源类别中清除哪些要素。

bob体育app 281 var queryLondonCustomers = from cust in customers 2        where cust.City = "London" 3       select cust; 只回去地址坐落于London的 customers。

  您能够选择深谙的 C# 逻辑 AND(&&)和 OR(||) 运算符来依照必要在 where 子句中运用率性数量的筛选表明式。 

bob体育app 29where cust.City = "London" && cust.Name = "Devon" 若要只回去坐落于“London”和姓名字为“Devon”的客商 bob体育app 30where cust.City = "London" || cust.Name = "Paris" 若要重临坐落于London或法国首都的客商

 

  2.3 排序:orderby

  常常能够很有利地将重临的数量举办排序。orderby 子句将使再次回到的队列中的成分依据被排序的花色的私下认可相比器进行排序。

bob体育app 31bob体育app 32

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 子句将使重返的连串中的成分依据被排序的品种的暗中认可相比较器进行排序。

bob体育app 331 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.4 分组:group

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

bob体育app 34bob体育app 35

 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 关键字来创设可进一层询问的标记符。

bob体育app 36bob体育app 37

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 子句,您能够按钦点的键分组结果。

bob体育app 38 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卡塔尔(英语:State of Qatar); 7 foreach (var cust in queryLondonCustomer卡塔尔(英语:State of Qatar) 8 { 9 Console.WriteLine(cust.Name卡塔尔; 10 } 11 } 您能够钦命结果应按 City 分组,以便坐落于London或时尚之都的持有客户坐落于各自组中。

  在本例中,cust.City 是键。

  在使用 group 子句截至查询时,结果运用列表的列表格局。列表中的每种成分是一个独具 Key 成员及借助该键分组的成分列表的靶子。在循环访谈生成组种类的查询时,您必需接受嵌套的 foreach 循环。外界循环用于循环访问每一种组,内部循环用于循环访谈每种组的成员。  

  倘若你必得引用组操作的结果,能够采纳 into 关键字来创设可进一步查询的标记符。

bob体育app 391 //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; 这里的查询只回去那么些含有五个以上的顾客的组。

 

版权声明:本文由bob体育app发布于bob体育平台,转载请注明出处:bob体育app[C#] 开始使用 LINQ,