Entity Framework中使用IEnumerable<T>、IQueryable<T>及IList<T>的区别
1. IEnumerable<T>
IEnumerable<T> :对于在内存中集合上运行的方法,返回的可枚举对象将捕获传递到方法的参数。在枚举该对象时,将使用查询运算符的逻辑,并返回查询结果。
IEnumerable<T>在.Net2.0引入。
IEnumberable使用的是LINQ to Object方式,将AsEnumerable()时对应的所有记录先加载到内存,再在此基础上再执行后面的Query。
本地数据源用IEnumerable<T>,并且查询的逻辑可以直接用你所定义的方法的逻辑。
using (PortalContext context = new PortalContext()) { // 延迟执行 IEnumerable<Category> expr = (from c in context.Categories select c).AsEnumerable().Take(5); foreach (var item in expr) { Console.WriteLine(item.CategoryName); } }
执行的SQL语句:
SELECT [Extent1].[CategoryID] AS [CategoryID], [Extent1].[CategoryName] AS [CategoryName] FROM [dbo].[Category] AS [Extent1]
IEnumerable<T>是延时执行(Deferred Execution)。
2. IQueryable<T>
IQueryable <T> :不会实现任何查询行为,但会生成一个表示要执行的查询的表达式树。查询处理由源 IQueryable<T> 对象处理。
IQueryable <T>在.Net支持Linq引入。
远程数据源用IQueryable<T>,无法直接使用你所定义的方法的逻辑,必须先生成表达式树,查询由源对象处理。
using (PortalContext context = new PortalContext()) { // 延迟执行 IQueryable<Category> expr = (from c in context.Categories select c).Take(5); foreach (var item in expr) { Console.WriteLine(item.CategoryName); } }
执行的SQL语句:
SELECT TOP (5) [c].[CategoryID] AS [CategoryID], [c].[CategoryName] AS [CategoryName] FROM [dbo].[Category] AS [c]
以上实例中,IQueryable<T>查询使用了LINQ to Sql的处理方式,在远处数据库中查询数据。
IQueryable<T>是延时执行(Deferred Execution)。
3. IList<T>
IList是即时执行(Eager Execution)
using (PortalContext context = new PortalContext()) { // 即时执行 IList<Category> expr = (from c in context.Categories select c).Take(5).ToList(); }
执行的SQL语句:
SELECT TOP (5) [c].[CategoryID] AS [CategoryID], [c].[CategoryName] AS [CategoryName] FROM [dbo].[Category] AS [c]