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语句的条件部分,同时告诉你说要返回一个什么类型:

posted @ 2022-02-09 15:09  wolfsocket  阅读(230)  评论(0编辑  收藏  举报