发端选拔,LINQ学习笔记

1、C#中LINQ to Objects中延迟查询的陷阱(其余门类的LINQ也基本一致)

  查询是1种从数据源检索数据的表明式。查询普通用专门的询问语言来表示。随着年华的延期,人们曾经为各个数据源开拓了差异的言语;比如,用于关周到据库的
SQL 和用于 XML 的
XQuery。由此,开荒人士不得不针对他们不可能不援助的各类数据源或数量格式而读书新的查询语言。LINQ
通过提供壹种跨各样数据源和数目格式使用数据的一样模型,简化了那一情景。在
LINQ 查询中,始终会用到目的。能够动用同1的骨干编码方式来查询和改动 XML
文书档案、SQL 数据库、ADO.NET 数据集、.NET 会集中的数据以及对其有 LINQ
提供程序可用的任何别的格式的多寡。

LINQ:开始选用 LINQ(壹)- 介绍 LINQ 查询,linq查询

前边在任何时间任何地点解LINQ延迟查询的时候,作者利用上边包车型客车这种方式,将where语句的结果一贯as为List<T>对象,结果取得的temp为NULL,苦思不得其解;

  询问操作的七个部分

开端使用 LINQ (壹)- 介绍 LINQ 查询

  查询是一种从数据源检索数据的表达式。
随着时光的延迟,人们已经为各类数据源开拓了差别的语言;举例,用于关全面据库的
SQL 和用来 XML 的 XQuery。
由此,开垦职员不得不针对他们必须支持的每一个数据源或数额格式而读书新的询问语言。
LINQ
通过提供壹种跨数据源和数量格式使用数据的同样模型,简化了这一动静。在
LINQ 查询中,始终会用到对象。能够运用同一的编码情势来询问和转移 XML
文书档案、SQL 数据库、ADO.NET 数据集、.NET 集结中的数据以及对其有 LINQ
提供程序可用的其余此外格式的数码。  

List<person> lst = new List<person>(){
    new person(){id=1,name="cyong"},
    new person(){id=2,name="lshan"}
};
List<person> temp = lst.Where(m => m.id > 1) as List<person>;

  全体 LINQ 查询操作都由以下四个例外的操作结合:

1、查询操作的多少个部分

 

  一、获取数据源。

  1.操作叁部曲:

          (1)获取数据源           (贰)创建查询          
(三)推行查询

 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 }

图片 1

 

  下图展现了一体化的询问操作。在 LINQ
中,查询的推行与查询本人天地之别;换句话说,查询本身指的是只创建查询变量,不检索任何数据。

图片 2

 

求解思路:

  贰、创设查询。

二、数据源

    在上2个示范中,由于数据源是数组,因而它隐式辅助泛型 IEnumerable<T> 接口。
帮助 IEnumerable<T> 或派生接口(如泛型 IQueryable<T>)的类外号为可查询类型。
 

    可查询类型无需开始展览退换或特殊管理就能够用作 LINQ
数据源。假使源数据还不曾作为可查询类型出现在内部存款和储蓄器中,则 LINQ
提供程序必须以此方法表示源数据。  比如,LINQ to XML 将 XML
文书档案加载到可查询的 XElement 类型中:

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

    在 LINQ to SQL 中,首先须求创立对象关系映射。
针对那个目的编排查询,然后由 LINQ to SQL
在运维时处理与数据库的通讯。在底下的以身作则中,Customers 表示数据库中的特定表。
 

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;

    

  一齐首感觉是LINQ语句的题目,但是在屡次测试之后,发掘 lst.Where(m
=> m.id > 一)
确实是语法准确的,并且能够在调用ToList()扩充方法后赶回精确的结果集;

  三、试行查询。  

三、查询

  查询钦命要从数据源中检索的新闻。
查询还是能内定在回去那个消息以前怎样对其张开排序、分组和结构化。
查询存款和储蓄在查询变量中,并用查询表达式实行早先化。

  以前的示范中的查询是从整数数组中回到全部的偶数。
该查询表明式包蕴五个子句:fromwhere 和 select。(若是您熟知SQL,您会注意到这一个子句的顺序与 SQL
中的顺序相反。)from 子句钦命数据源,where 子句钦赐应用筛选器,select 子句钦定重临的元素的类型。
近日急需专注的是,在 LINQ
中,查询变量本身不进行其余操作并且不回去任何数据。
它只是存款和储蓄在后头某些时刻实践查询时为变化结果而须要的音讯。  

  而后,考虑是as的难点,查看as的行使方法,开采as是项目安全的转移形式,当转变战败时不会报错,而是再次来到null;不过查看文书档案发掘Where语句再次来到的是IEnumerable<TSource>,而IEnumerable<T>在相似情形下(举例小编先将2个List<T>转变为IEnumerable<T>,再通过2遍as转变回来)是足以健康转变为List<T>的;

  上边的演示演示如何用源代码表示查询操作的八个部分。为便利起见,此示例将3个平头数组用作数据源;但里面提到的定义一样适用于别的数据源。本核心的其他部分也会引用此示例。

四、查询推行

求助:

图片 3图片 4Code
 1图片 5using System;
 2图片 6using System.Collections.Generic;
 3图片 7using System.Linq;
 4图片 8using System.Text;
 5图片 9
 6图片 10namespace LINQDemo2
 7图片 11图片 12图片 13{
 8图片 14    class Program
 9图片 15图片 16    图片 17{
10图片 18        static void Main(string[] args)
11图片 19图片 20        图片 21{
12图片 22            //int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6 };
13图片 23
14图片 24            //var query = from num in numbers
15图片 25            //            where (num % 2 ) == 1
16图片 26            //            select num;
17图片 27            //foreach (int num in query)
18图片 28            //{
19图片 29            //    Console.WriteLine(“{0,1}”,num);
20图片 30            //}
21图片 31
22图片 32            // The Three Parts of a LINQ Query:
23图片 33            //  1. Data source.
24图片 34图片 35            string[] strArray = new string[] 图片 36{ “fine”,”Thank”,”you”,”Hello”,”World” };
25图片 37
26图片 38            // 2. Query creation.
27图片 39            // numQuery is an IEnumerable<int>
28图片 40            var stringQuery = from str in strArray
29图片 41                              where str.Length == 5
30图片 42                              select str;
31图片 43            // 3. Query execution.
32图片 44            foreach (string s in stringQuery)
33图片 45图片 46            图片 47{
34图片 48                Console.WriteLine(“{0,1}”, s);
35图片 49            }
36图片 50        }
37图片 51    }
38图片 52}

  1.延缓实施

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

  然后就将这几个标题抛给了群里面包车型客车一批大神。经过壹番教导,才意识这几个主题材料的原故是LINQ的懒加载(延迟查询)。

 

  二.强制立刻试行

    对1各个源成分实施聚合函数的查询必须首先循环访问这么些要素。CountMaxAverage 和 First 就属于此类查询。由于查询自个儿必须选用 foreach 以便回到结果,由此那几个查询在实践时不应用显式 foreach 语句。其它还要注意,这一个品种的询问重临单个值,而不是 IEnumerable 集合。 

var numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

var evenNumQuery =
    from num in numbers
    where (num % 2) == 0
    select num;

var evenNumCount = evenNumQuery.Count();

图片 53

 

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

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();

    其它,还足以经过在紧跟查询表明式之后的岗位放置一个 foreach 循环来强制试行查询。但是,通过调用 ToList 或 ToArray,也得以将具有数据缓存在单个集合对象中。  

 

  上文档:

  下图显示了1体化的询问操作。在 LINQ
中,查询的施行与查询本人天堂地狱;换句话说,借使只是创制查询变量,则不会找寻任何数据。

【来源】文字重要来源微软官方文书档案、部分图片也出自微软官方文书档案。

LINQ(1)- 介绍 LINQ
查询,linq查询 开头采用 LINQ (1)- 介绍 LINQ 查询
查询是1种从数据源检索数据的表明式。 随着时光…

  LINQ查询简要介绍

图片 54

  文书档案中牵线到【查询变量本人只存款和储蓄查询命令。查询的实际实施将延迟到“foreach”语句中循环访问查询变量之后进展;同时,也得以透过ToList也许ToArray方法强制马上实行,以将查询结果缓存到单个集结对象中】

  在上1个演示中,由于数据源是数组,因而它隐式协助泛型
IEnumerable<(Of <(T>)>) 接口。那一实际表示该数据源能够用
LINQ 举办查询。在 foreach 语句中施行查询,而 foreach 必要运用
IEnumerable 或 IEnumerable<(Of <(T>)>)。支持IEnumerable<(Of <(T>)>) 或派生接口(如泛型 IQueryable<(Of
<(T>)>))的项目称为“可查询类型”。

  Enumerable.Where<TSource>方法(IEnumerable<TSource>,Func<TSource,Int32,Boolean>).aspx)

  可查询类型不须要打开改造或新鲜管理就足以用作 LINQ
数据源。假使源数据还不曾当做可查询类型出现在内部存款和储蓄器中,则 LINQ
提供程序必须以此方法表示源数据。

  此格局运用的是LINQ的推移查询。

  上3个示范中的查询从整数数组中回到全数偶数。该查询表明式包括两个子句:from、where
和 select。(即让你熟知 SQL,您会专注到这个子句的逐条与 SQL
中的顺序相反。)from 子句钦点数据源,where 子句应用筛选器,select
子句钦赐再次来到的要素的连串。LINQ 查询表明式(C#
编制程序指南)壹节中详尽座谈了那几个子句和别的查询子句。近期亟需留意的是,在
LINQ
中,查询变量自个儿不实行其余操作并且不回来任何数据。它只是存款和储蓄在现在有个别时刻试行查询时为变化结果而须要的新闻。

结论:

  

  壹、LINQ查询只是缓存查询命令,要拜访问调查询结果,应该运用foreach去迭代只怕应用ToList()或许ToArray方法强制马上举行并缓存到集合对象中。

  延迟施行

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

  由于查询变量本人并未有保存查询结果,由此得以依赖必要自由推行查询。举个例子,能够经过八个独自的应用程序持续立异数据库。在应用程序中,能够成立二个追寻最新数据的询问,并得以按某目前间间隔往往施行该查询以便每趟搜寻不相同的结果。

  强制立时试行
  对壹多级源成分试行聚合函数的询问必须首先循环访问这几个成分。Count、马克斯、Average
和 First 就属于此类查询。由于查询本人必须选用 foreach
以便回到结果,由此那几个查询在实践时不选用显式 foreach
语句。其余还要小心,那么些品种的查询重回单个值,而不是 IEnumerable
集结。上边包车型地铁询问再次回到源数组中偶数的计数:  

图片 55var evenNumQuery = 
图片 56    from num in numbers
图片 57    where (num % 2) == 0
图片 58    select num;
图片 59
图片 60int evenNumCount = evenNumQuery.Count();

  若要强制立即实践放肆查询并缓存其结果,能够调用 ToList<(Of
<(TSource>)>) 或 ToArray<(Of <(TSource>)>) 方法。

图片 61图片 62Code
图片 63List<int> numQuery2 =
图片 64    (from num in numbers
图片 65     where (num % 2) == 0
图片 66     select num).ToList();
图片 67
图片 68// or like this:
图片 69// numQuery3 is still an int[]
图片 70
图片 71var numQuery3 =
图片 72    (from num in numbers
图片 73     where (num % 2) == 0
图片 74     select num).ToArray();

  其它,仍是能够透过在紧跟查询表明式之后的职分放置3个 foreach
循环来强制施行查询。不过,通过调用 ToList
ToArray,也能够将具有数据缓存在单个集合对象中。

 

  2、MSDN文档不得不看看。

附图:

  壹、同行指教

图片 75

图片 76

 

Post Author: admin

发表评论

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