Linq持续学习中

1.LINQ(Language Integrated Query)即语言集成查询。LINQ是一组语言特性和API,使得你可以使用统一的方式编写各种查询。用于保存和检索来自不同数据源的数据,从而消除了编程语言和数据库之间的不匹配,以及为不同类型的数据源提供单个查询接口。LINQ总是使用对象,因此你可以使用相同的查询语法来查询和转换XML、对象集合、SQL数据库ADO.NET数据集以及任何其他可用的LINQ提供程序格式的数据。LINQ主要包含以下三部分:主要负责对象的查询;XML的查询;数据库的查询。 
在.NET类库中,LINQ相关类库都在System.Linq命名空间下,该命名空间提供支持使用LINQ进行查询的类和接口,其中最主要的是以下两个类和两个接口。 
IEnumerable接口:它表示可以查询的数据集合,一个查询通常是逐个对集合中的元素进行筛选操作,返回一个新的IEnumerable接口,用来保存查询结果。 
IQueryable接口:他继承IEnumerable接口,表示一个可以查询的表达式目录树。 
Enumerable类:它通过对IEnumerable提供扩展方法,实现LINQ标准查询运算符。包括过路、导航、排序、查询、联接、求和、求最大值、求最小值等操作。 
Queryable类:它通过对IQueryable提供扩展方法,实现LINQ标准查询运算符。包括过路、导航、排序、查询、联接、求和、求最大值、求最小值等操作。

 Enumerable和Queryable的区别:

1)使用场合不同:Enumerable适合在内存数据集合中使用(如数组、List等),Queryable适合在离线数据集合中使用(如EF中的dbContext中的DbSet中使用) 

2)返回类型不同:VS会根据你使用的数据集合的类型来自动使用相应命名空间下的方法,这是因为VS选择了最优的使用。当返回数据集合如Where方法时,Enumerable的Where返回的IEnumerable<>,Queryable的Where返回的是IQueryable<>,这两个集合有什么区别呢?IEnumerable<>是本地集合存在内存中,而IQueryable<>属于离线集合,在使用到返回的集合IQueryable<>才加载数据,属于延迟加载。

3)参数不同:Enumerable需要的参数是委托类型Func<>,Queryable需要的参数类型是数据结构

Expression<Func<User, bool>> expression = u => u.Id > 0;

Func<int, bool> expression2 = u => u> 0;

IEnumerable<int> x2 = x.Where(expression2);

IQueryable<User> userSet = db.UserSet.Where(expression);

2.LINQ的优势

(1)熟悉的语言:开发人员不必为每种类型的数据源或数据格式学习新的语言。

(2)更少的编码:相比较传统的方式,LINQ减少了要编写的代码量。

(3)可读性强:LINQ增加了代码的可读性,因此其他开发人员可以很轻松地理解和维护。

(4)标准化的查询方式:可以使用相同的LINQ语法查询多个数据源。

(5)类型检查:程序会在编译的时候提供类型检查。

(6)智能感知提示:LINQ为通用集合提供智能感知提示。

(7)整形数据:LINQ可以检索不同形状的数据。CLR本身并不理解查询表达式语法,它只理解方法语法。编译器负责在编译时将查询表达式语法翻译为方法语法。

1)查询表达式语法

例子:var result = from p in ints where p % 2 != 0 select p;

2)方法语法:主要利用System.Linq.Enumerable类中定义的扩展方法和Lambda表达式方式进行查询,类似于如何调用任何类的扩展方法。

   例子:var result = ints.Where(p => p % 2 == 0).ToArray();

4. Linq基础语法

1)where查询

2)简单的函数计算(count,min,max,sum)

3)排序

4)top查询,take为查询多少条数据,注意:

First()返回结果集中第一个匹配的元素,如果找不到会发生异常;

FirstOrDefault()返回结果集中第一个匹配的,如果找不到会返回空。

5)跳过前面多少条数据取余下的数据

6)分页查询

7)包含,类似like '%%'

8)group by

9)连接查询

 10)select和selectmany的区别

Select() 如何返回一个与源集合具有相同元素数目的集合。

SelectMany() 如何将中间数组序列串联为一个最终结果值,其中包含每个中间数组中的每个值。

原文地址:https://www.cnblogs.com/qqvvn/p/9574945.html