IEnumerable与IQueryable延迟加载

>Enumable类型是linq to object 是一个很特殊的类型 这个类型的数据源都是在程序的内存中

>Queryable类型是 Linq to sql 对数据库进行操作都是这个类型 这个类型会生成表达式目录树

csharp 复制代码
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);
                                }
                            }
csharp 复制代码
var q = from c in dbContext.Customers
    where c.City == "London"
    select c;
var finalAnswer = from c in q
                    orderby c.Name
                    select c;
// 迭代被省略的最终答案序列的代码

var q = (from c in dbContext.Customers
            where c.City == "London"
            select c).AsEnumerable();
var finalAnswer = from c in q
                    orderby c.Name
                    select c;
//迭代最终答案的代码

IQueryable内置 的LINQ to SQL机制,

IEnumerable是把数据库对象强制转为 IEnumerable形式的序列,并把排序等工作放在本地 完成。

有些功能用IQueryable实现起来要比用IEnumerable快得多。

用IEnumerable所写的那个版本必须在本地执行,系统要把lambda表达式编译到方法里面,并在本地计算机上面运行,这意味着无论有待处理的数据在不在本地,都必须先获取过来才行。

用IQueryable实现出来的版本则会解析表达式树,在解析的时候,系统会把这棵树所表示的逻辑转换成provider能够操作的格式,并将其放在 离数据最近的地方 去执行

如果在性能与健壮这两项因素之间更看重后者,那么可以把查询结果明确转换成IEnumerable,这样做的缺点是LINQ to SQL引擎必须把dbContext.Products中的所有内容都从数据库中获取过来。

可以使用AsEnumerable()与AsQueryable()进行相互转换。IQueryable更适合远程执行(数据库)。

一言以蔽之,本地数据源用IEnumerable , 并且查询的逻辑可以直接用你所定义的方法的逻辑(因为有上下文),远程数据源用IQueryable ,无法直接使用你所定义的方法的逻辑,必须先生成表达式树,查询由源对象处理。

IQueryable :远程数据源不能直接传Func,必须用一个 Expression来包装这个Func

IEnumerable:可以直接用本地方法。

总结之,IEnumerable查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大量的数据是我们不需要的无效数据.但是我们却不得不传输更多的数据.做更多的无用功.而IQueryable却总能只提供你所需要的数据.大大减少了数据的传输

IQueryable是负责生成SQL语句的,但并不马上执行;

IEnumerable是对任意类型的集合都能操作的,不限于是数据库还是一般的Array还是List。
(1)Enumerable类,对继承了IEnumerable接口的集合进行扩展;

(2)Queryable类,针对继承了IQueryable接口的集合进行扩展。

》》Enumerable类 不延迟加载,但延迟查询

public static IEnumerable Where(this IEnumerable source, Func<TSource, bool> predicate);

public static IEnumerable Where(this IEnumerable source, Func<TSource, int, bool> predicate);

》》Queryable类 延迟加载,用到数据才加载。

public static IQueryable Where(this IQueryable source, Expression<Func<TSource, bool>> predicate);

public static IQueryable Where(this IQueryable source, Expression<Func<TSource, int, bool>> predicate);


相关推荐
计算机毕设定制辅导-无忧学长1 小时前
西门子 PLC 与 Modbus 集成:S7-1500 RTU/TCP 配置指南(一)
服务器·数据库·tcp/ip
程序员柳2 小时前
基于微信小程序的校园二手交易平台、微信小程序校园二手商城源代码+数据库+使用说明,layui+微信小程序+Spring Boot
数据库·微信小程序·layui
梦在深巷、2 小时前
MySQL/MariaDB数据库主从复制之基于二进制日志的方式
linux·数据库·mysql·mariadb
IT乌鸦坐飞机2 小时前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7
IT_10242 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
祁思妙想3 小时前
八股学习(三)---MySQL
数据库·学习·mysql
惊骇世俗王某人4 小时前
1.MySQL之如何定位慢查询
数据库·mysql
秦歌6664 小时前
向量数据库-Milvus快速入门
数据库·milvus
Edingbrugh.南空5 小时前
Flink SQLServer CDC 环境配置与验证
数据库·sqlserver·flink
码不停蹄的玄黓6 小时前
MySQL分布式ID冲突详解:场景、原因与解决方案
数据库·分布式·mysql·id冲突