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语句的条件部分,同时告诉你说要返回一个什么类型:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现