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