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() 如何将中间数组序列串联为一个最终结果值,其中包含每个中间数组中的每个值。