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适用于内存中的集合。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本