C# IEnumerable与IQueryable ,IEnumerable与IList ,LINQ理解Var和IEnumerable
原文:https://www.cnblogs.com/WinHEC/articles/understanding-var-and-ienumerable-with-linq.html
使用LINQ从数据库和集合中查询数据时,我们使用IEnumerable和IQueryable进行数据处理。 IQueryable继承自IEnumerable,因此IQueryable具有IEnumerable的所有功能,除此之外,它还具有自己的功能。 两者都有自己的重要性来查询和操作数据。 让我们看看二者的优势,并利用它们的优势来提升你的LINQ Query性能。
IEnumerable
IEnumerable存在于System.Collections命名空间中。
IEnumerable只能在集合上向前移动,它不能向后移动和在Items之间移动。
IEnumerable最好从内存中的集合查询数据,如List、Array等。当从数据库查询数据时,IEnumerable在服务器端执行select查询,然后在客户端加载内存中的数据,最后过滤数据。
IEnumerable适用于LINQ to Object和LINQ to XML查询。
IEnumerable支持延迟执行。
IEnumerable不支持自定义查询,也不支持延迟加载。 因此不适合类似于分页的场景。
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
IQueryable存在于System.Linq命名空间中。
IQueryable只能在集合上向前移动,它不能向后移动和在项目之间移动。
IQueryable最好从非内存集合中查询数据(如远程数据库,服务等)。从数据库查询数据时,IQueryable在服务器端执行带所有筛选器的SELECT查询。
IQueryable适用于LINQ to SQL查询。
IQueryable支持延迟执行。
IQueryable支持使用CreateQuery和Execute方法进行自定义查询。
IQueryable支持延迟加载。 因此,它适合于类似分页的场景。
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
IList存在于System.Collections命名空间中。
IList用于访问列表中特定位置/索引中的元素。
像IEnumerable一样,IList也最好从列表,数组等内存中的集合查询数据。
当您要从列表中添加或删除项目时,IList很有用。
IList可以在不迭代集合的情况下找出集合中的元素的数量。
IList支持延迟执行。
IList不支持进一步过滤。
IEnumerable
IEnumerable存在于System.Collections命名空间中。
IEnumerable只能在集合上向前移动,它不能向后移动和在Item之间移动。
IEnumerable最好从列表,数组等内存中的集合查询数据。
IEnumerable不支持从列表中添加或删除项目。
使用IEnumerable,我们可以在迭代集合后找出集合中的元素的数量。
IEnumerable支持延迟执行。
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 );

总结:
在LINQ查询中,当您想要“自定义”类型时,请使用Var类型。
在LINQ查询中,当您已经知道查询结果的类型时,请使用IEnumerable。
在LINQ查询中,Var也适用于远程集合(数据库或其他服务),因为它的行为类似于IQuerable。
IEnumerable适用于内存中的集合。
C# IEnumerable与IQueryable ,IEnumerable与IList ,LINQ理解Var和IEnumerable的更多相关文章
- IEnumerable 与 Iqueryable 的区别
IEnumerable 和 IQueryable 共有两组 LINQ 标准查询运算符,一组在类型为 IEnumerable<T> 的对象上运行,另一组在类型为 IQueryable&l ...
- IEnumerable和IQueryable和Linq的查询
IEnumerable和IEnumerable 1.IEnumerable查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大量的数据是我们不需要的无效数据 ...
- LINQ查询中的IEnumerable<T>和IQueryable<T>
LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展:Queryab ...
- 编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T> LINQ查询一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:E ...
- 2019.03.22 读书笔记 Linq中的IEnumerable与IQueryable
Linq主要分为 Linq to object .Linq to XML .Linq to sql(现在都用EF了). 针对object和sql,微软分别设计了两套接口IEnumerable.IQue ...
- 【C#夯实】我与接口二三事:IEnumerable、IQueryable 与 LINQ
序 学生时期,有过小组作业,当时分工一人做那么两三个页面,然而在前端差不多的时候,我和另一个同学发生了争执.当时用的是简单的三层架构(DLL.BLL.UI),我个人觉得各写各的吧,到时候合并,而他觉得 ...
- IEnumerable和IQueryable区别、优缺点
转自 http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html IEnumerable接口 公开枚举器,该枚举器支持在指定类型 ...
- IEnumerable和IQueryable的区别
转自:http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html IEnumerable接口 公开枚举器,该枚举器支持在指定类型 ...
- IEnumerable和IQueryable的区别以及背后的ExpressionTree表达式树
关于IEnumerable和IQueryable的区别,这事还要从泛型委托Func<T>说起.来看一个简单的泛型委托例子: class Program { static void Main ...
随机推荐
- vue 概念与使用vue-cli脚手架快速构建项目
vue 定义:是一套构建用户界面的渐进式框架,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合. 数据渲染机制: 核心: 响应式数据绑定 ...
- 使用Github 当作自己个人博客的图床
使用Github 当作自己个人博客的图床 前提 本文前提: 我个人博客的草稿是存放在 github上的一个仓库 diarynote 截图存放的图片或者需要放在文章中图片,会固定存放在对应的文件夹中,我 ...
- python高级:垃圾回收机制
---恢复内容开始--- 垃圾回收机制 1.计数引用机制 就是一个变量.数据结构.对象当没有人引用时,python的会启用垃圾回收机制,将其从内存中删除. 怎么看引用的次数呢?sys模块提供的sys. ...
- 阿里云弹性裸金属服务器-神龙架构(X-Dragon)揭秘
在5月16日的飞天技术会新品直播中,特别邀请了业界知名大咖狒哥以及阿里云虚拟化资深专家旭卿作为现场直播的嘉宾.本次直播主要从产品背景到“X-Dragon架构”,从硬件设备到软件应用来深度的剖析“X-D ...
- 【HDOJ6687】Rikka with Stable Marriage(Trie树,贪心)
题意:给定两个长均为n的序列a和b,要求两两配对,a[i]和b[j]配对的值为a[i]^b[j],求配对后的值之和的最大值 n<=1e5,a[i],b[i]<=1e9 思路:和字典序最大的 ...
- lightoj1094 - Farthest Nodes in a Tree
1094 - Farthest Nodes in a Tree PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limi ...
- scau 17967 大师姐唱K的固有结界
17967 大师姐唱K的固有结界 该题有题解 时间限制:1000MS 内存限制:65535K 提交次数:41 通过次数:8 收入:107 题型: 编程题 语言: G++;GCC;VC Descr ...
- 台哥原创:java 扫雷源码
扫雷,十年前大学时候开发的,界面参照的电脑自带扫雷游戏. 一直是我最喜欢的单机游戏,现在微软的新系统都不能玩了. 幸好还有自己开发的,可以过下瘾.程序员就有这点好处嘛. 这几年陆陆续续,把这个扫雷 ...
- Share架构的一些心得
个人这些年,从web->system service->app 项目实战,陆陆续续经历的项目很多,自己也数不清.自己也一直对于架构没有明确去给出一个自己的定义描述. 刚好最近一直在flut ...
- 移动端调试 — 安卓机+chrome
移动端开发时,我们常使用chrome自带的模拟器,模拟各种手机设备. 但模拟毕竟是模拟,当开发完毕,使用真机访问页面出现问题时如何调试呢? 下面介绍一种针对Android机的调试方法 1. 在pc和a ...