原文:https://www.cnblogs.com/WinHEC/articles/understanding-var-and-ienumerable-with-linq.html

使用LINQ从数据库和集合中查询数据时,我们使用IEnumerable和IQueryable进行数据处理。 IQueryable继承自IEnumerable,因此IQueryable具有IEnumerable的所有功能,除此之外,它还具有自己的功能。 两者都有自己的重要性来查询和操作数据。 让我们看看二者的优势,并利用它们的优势来提升你的LINQ Query性能。

IEnumerable

  1. IEnumerable存在于System.Collections命名空间中。

  2. IEnumerable只能在集合上向前移动,它不能向后移动和在Items之间移动。

  3. IEnumerable最好从内存中的集合查询数据,如List、Array等。当从数据库查询数据时,IEnumerable在服务器端执行select查询,然后在客户端加载内存中的数据,最后过滤数据。

  4. IEnumerable适用于LINQ to Object和LINQ to XML查询。

  5. IEnumerable支持延迟执行。

  6. IEnumerable不支持自定义查询,也不支持延迟加载。 因此不适合类似于分页的场景。

  7. IEnumerable支持扩展方法以获取实用对象。

IEnumerable示例:

MyDataContext dc = new MyDataContext ();
IEnumerable<Employee> list = dc.Employees.Where(p => p.Name.StartsWith("S"));
list = list.Take<Employee>(10);

以上查询将生成如下的SQL语句:

SELECT [t0].[EmpID], [t0].[EmpName], [t0].[Salary]
FROM [Employee] AS [t0]
WHERE [t0].[EmpName] LIKE @p0

注意:在这个查询语句中缺少 [ TOP 10 ] ,因为IEnumerable是在客户端过滤数据的。

IQueryable

  1. IQueryable存在于System.Linq命名空间中。

  2. IQueryable只能在集合上向前移动,它不能向后移动和在项目之间移动。

  3. IQueryable最好从非内存集合中查询数据(如远程数据库,服务等)。从数据库查询数据时,IQueryable在服务器端执行带所有筛选器的SELECT查询。

  4. IQueryable适用于LINQ to SQL查询。

  5. IQueryable支持延迟执行。

  6. IQueryable支持使用CreateQuery和Execute方法进行自定义查询。

  7. IQueryable支持延迟加载。 因此,它适合于类似分页的场景。

  8. IQueryable支持扩展方法以使用表达式对象,表达式树。

IQueryable示例:

1  MyDataContext dc = new MyDataContext ();
2 IQueryable<Employee> list = dc.Employees.Where(p => p.Name.StartsWith("S"));
3 list = list.Take<Employee>(10);

以上查询将生成如下的SQL语句:

SELECT TOP 10 [t0].[EmpID], [t0].[EmpName], [t0].[Salary] FROM [Employee] AS [t0]
WHERE [t0].[EmpName] LIKE @p0

注意:在这个查询语句中[ TOP 10 ] 是存在的,因为IQueryable是在SQLSERVER中执行带筛选条件的SQL语句的。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

IList

  1. IList存在于System.Collections命名空间中。

  2. IList用于访问列表中特定位置/索引中的元素。

  3. 像IEnumerable一样,IList也最好从列表,数组等内存中的集合查询数据。

  4. 当您要从列表中添加或删除项目时,IList很有用。

  5. IList可以在不迭代集合的情况下找出集合中的元素的数量。

  6. IList支持延迟执行。

  7. IList不支持进一步过滤。

IEnumerable

  1. IEnumerable存在于System.Collections命名空间中。

  2. IEnumerable只能在集合上向前移动,它不能向后移动和在Item之间移动。

  3. IEnumerable最好从列表,数组等内存中的集合查询数据。

  4. IEnumerable不支持从列表中添加或删除项目。

  5. 使用IEnumerable,我们可以在迭代集合后找出集合中的元素的数量。

  6. IEnumerable支持延迟执行。

  7. IEnumerable支持进一步的过滤。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Var是匿名类型,所以尽管你不知道它的输出类型也可以使用它。 在LINQ中,假设您正在Join查询两张表,并从两张表中检索数据,则结果将为匿名类型。

1  var q =(from e in tblEmployee
2 join d in tblDept on e.DeptID equals d.DeptID
3 select new
4 {
5   e.EmpID,
6   e.FirstName,
7   d.DeptName
8 });

在上面的查询中,由于结果来自两张表,因此使用 var 类型。

var q =(from e in tblEmployee where e.City=="Delhi"
select new {
e.EmpID,
FullName=e.FirstName+" "+e.LastName,
e.Salary
});

在上面的查询中,结果只来自单个表,但是我们将员工的名字和姓氏组合为新的类型为FullName,这是匿名类型,因此使用Var类型。 因此,当您想要快速制作“自定义”类型时,请使用Var类型。
更多时候,var变量就像IQueryable一样,因为它在服务器端执行带所有过滤器的SELECT查询。 请参考下面的例子来解释。

IEnumerable示例:

1  MyDataContext dc = new MyDataContext ();
2 IEnumerable<Employee> list = dc.Employees.Where(p => p.Name.StartsWith("S"));
3 list = list.Take<Employee>(10);

以上查询将生成如下的SQL语句:

1 SELECT [t0].[EmpID], [t0].[EmpName], [t0].[Salary]
2 FROM [Employee] AS [t0]
3 WHERE [t0].[EmpName] LIKE @p0

注意:在这个查询语句中缺少 [ TOP 10 ] ,因为IEnumerable是在客户端过滤数据的。

Var 示例:

 MyDataContext dc = new MyDataContext ();
var list = dc.Employees.Where(p => p.Name.StartsWith("S"));
list = list.Take<Employee>(10);

以上查询将生成如下的SQL语句:

SELECT TOP 10 [t0].[EmpID], [t0].[EmpName], [t0].[Salary] FROM [Employee] AS [t0] WHERE [t0].[EmpName] LIKE @p0

注意:在这个查询语句中是带有 [ TOP 10 ]的 ,因为这里的 var  的类型是 IQueryable 。它将在SQLSERVER端执行带所有过滤器的SELECT。

IEnumerable与LINQ

IEnumerable是一个只向前的集合,当我们已经知道查询结果的类型时很有用。 在下面的查询中,结果将是可以映射(员工表)的员工列表。

1 IEnumerable<tblEmployee> lst =
2 (
3 from e in tblEmployee
4 where e.City=="Delhi"
5 select e
6 );

总结:

  1. 在LINQ查询中,当您想要“自定义”类型时,请使用Var类型。

  2. 在LINQ查询中,当您已经知道查询结果的类型时,请使用IEnumerable。

  3. 在LINQ查询中,Var也适用于远程集合(数据库或其他服务),因为它的行为类似于IQuerable。

  4. IEnumerable适用于内存中的集合。

C# IEnumerable与IQueryable ,IEnumerable与IList ,LINQ理解Var和IEnumerable的更多相关文章

  1. IEnumerable 与 Iqueryable 的区别

    IEnumerable 和 IQueryable   共有两组 LINQ 标准查询运算符,一组在类型为 IEnumerable<T> 的对象上运行,另一组在类型为 IQueryable&l ...

  2. IEnumerable和IQueryable和Linq的查询

    IEnumerable和IEnumerable 1.IEnumerable查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大量的数据是我们不需要的无效数据 ...

  3. LINQ查询中的IEnumerable<T>和IQueryable<T>

    LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展:Queryab ...

  4. 编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>

    建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T> LINQ查询一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:E ...

  5. 2019.03.22 读书笔记 Linq中的IEnumerable与IQueryable

    Linq主要分为 Linq to object .Linq to XML .Linq to sql(现在都用EF了). 针对object和sql,微软分别设计了两套接口IEnumerable.IQue ...

  6. 【C#夯实】我与接口二三事:IEnumerable、IQueryable 与 LINQ

    序 学生时期,有过小组作业,当时分工一人做那么两三个页面,然而在前端差不多的时候,我和另一个同学发生了争执.当时用的是简单的三层架构(DLL.BLL.UI),我个人觉得各写各的吧,到时候合并,而他觉得 ...

  7. IEnumerable和IQueryable区别、优缺点

    转自 http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html IEnumerable接口 公开枚举器,该枚举器支持在指定类型 ...

  8. IEnumerable和IQueryable的区别

    转自:http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html IEnumerable接口 公开枚举器,该枚举器支持在指定类型 ...

  9. IEnumerable和IQueryable的区别以及背后的ExpressionTree表达式树

    关于IEnumerable和IQueryable的区别,这事还要从泛型委托Func<T>说起.来看一个简单的泛型委托例子: class Program { static void Main ...

随机推荐

  1. Linux下NFS服务器的搭建与配置(转)

    一.NFS服务简介 NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的. 它最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享个别 ...

  2. flask之视图函数从前端接收数据的方法

    一:从前端接收查询字符串  query-string 注意:get和post都可以在url后面添加查询字符串?a=1&b=2 测试工具:postman 1:get方式接收 视图函数 from ...

  3. python学习笔记(八)函数return多个值,列表推导式和交换两个变量的值

    函数return多个值: 补充知识点:写代码得到时候少用全局变量: 1.不安全 2.会一直占着内存不释放 函数多个return值,那么会把这几个return的值都放在一个元组里面,然后返回 def h ...

  4. Centos7防火墙和SELinux的开启和关闭

    在虚拟机里面开启多个服务,对应多个端口,在防火墙开启的情况下,就要对外开放端口,这样客户端才能正常访问,但比较繁琐,关闭更直接点. 防火墙 临时关闭防火墙 systemctl stop firewal ...

  5. Android中对Apk加固(加壳)续篇之---对Native层(so文件)进行加固

    有人说Android程序用Java代码写的,再怎么弄都是不安全的,很容易破解的,现在晚上关于应用加固的技术也很多了,当然这些也可以用于商业发展的,梆梆加密和爱加密就是很好的例子,当然这两家加固的Apk ...

  6. ssd_mobilenet_demo

    操作系统:windows 10  64位 内存:8G GPU:Nvidia MX 150 Tensorflow: 1.4 1.安装python Anaconda3-5.0.1 ,默认python版本( ...

  7. mui初级入门教程(一)— 小白入手mui的学习路线

    文章来源:小青年原创发布时间:2016-05-15关键词:mui,html5+转载需标注本文原始地址:http://zhaomenghuan.github.io/#!/blog/20160515 写在 ...

  8. Jira中的Tempo查看component以及issue的工作量汇总

    在右侧group by的地方,同时选中component和issue

  9. 124、TensorFlow替换函数

    # tf.device给你了很多可伸缩性在TensorFlow的计算图中选择放置你的单独的操作 # 在许多的情况下,有很多启发可以工作的很好 # 例如tf.train.replica_device_s ...

  10. day07——css布局解决方案之居中布局

     转行学开发,代码100天——2018-03-23 1.水平居中 使用inline-block + text-align方法 先将子框由块级元素改为行内块元素,再通过设置行内块元素居中以实现水平居中 ...