IQueryable和IEnumable区别
Enumable类型是linq to object 是一个很特殊的类型 这个类型的数据源都是在程序的内存中
Queryable类型是 Linq to sql 对数据库进行操作都是这个类型 这个类型会生成表达式目录树
using (CustomerDbContext context = new CustomerDbContext()) { Console.WriteLine("****************IQueryable*******************"); IQueryable<Commodity> commodity = context.Commodities.Where(c => c.Id == 20001); commodity.ToList(); commodity.ToArray(); commodity.ToDictionary(); //都可以去去加载数据 commodityquery = context.Commodities .Where(c => c.Id == 20001) .AsQueryable() .Where(c => c.Title.Contains("test")) .Where(c => c.Title.Contains("1")); Console.WriteLine("****************IQueryable*******************"); foreach (var item in commodityquery) //具体使用数据时候才去加载,延迟加载 会根据你的条件拼装sql 在数据库中精准的查你的数据 { Console.WriteLine(item.Title); } } Console.WriteLine("****************IEnumerable*******************"); IEnumerable<Commodity> commodityEnumer = null; using (CustomerDbContext context = new CustomerDbContext()) { commodityEnumer = context.Commodities .Where(c => c.Id == 20001) .AsEnumerable() //在AsEnumerable 之前的条件是到数据库中去执行,后面的Where条件是基于内存来过滤。会把所有的数据都拿出来 .Where(c => c.Title.Contains("test")) .Where(c => c.Title.Contains("1")); Console.WriteLine("****************IEnumerable*******************"); foreach (var item in commodityEnumer) { Console.WriteLine(item.Title); } }
1.二者在都是延迟执行的。
2.IQueryable类型,无论有多少个Where条件的拼接,都是 把条件拼接在一起, IEnumerable 之前的Where条件是查询数据库,之的 条 件 是 基于内存来操作的,二者比价,如果有多个条件,当然建议大家选择IQueryable类型
3.IEnumerable/IQueryable本质区别:
IEnumerable:实现了一个迭代器---基于集合--基于内存的一种对于数据访问的统一方式
IQueryable:包含了Expression(表达式目录树---拼装,无论有多少个条件,都可以拼装起来),包含了一个IQueryProvider(表达式目录树转变成Sql语句的驱动程序),包含了ElementType(返回数据的数据类型),一开始调用,就把所有的条件都拼装到表达式目录树中, 当要真正的要获取数据的时候,就把拼装好的完整的表达式目录树交给IQueryProvider,给转换成Sql语句的条件部分,同时告诉你说要返回一个什么类型: