IEnumerable VS IQueryable

使用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语句的。

 

上一篇:.NET(C#)判断泛型类型(List<>)和泛型接口(IEnumerable<>)的继承关系代码


下一篇:SelectMany 和 Select的区别