首页 > 其他分享 >LINQ使用细节之.AsEnumerable()和.ToList()的区别

LINQ使用细节之.AsEnumerable()和.ToList()的区别

时间:2023-05-11 23:05:13浏览次数:39  
标签:ToList IQueryable AsEnumerable IEnumerable LINQ query 执行

先看看下面的代码,用了 .AsEnumerable():

复制代码 复制代码
1 var query = (from a in db.Table
2 where a = SomeCondition
3 select a.SomeNumber).AsEnumerable();
4
5  int recordCount = query.Count();
6  int totalSomeNumber = query.Sum();
7  decimal average = query.Average();
复制代码 复制代码

运行起来发现执行了3次而不是1次,查询了3次数据库可不是什么好事情。如果把第一行换成.ToList()那就是只查询一次数据库。

.AsEnumerable()是延迟执行的,实际上什么都没有发生,当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行,例如下面的代码:

复制代码 复制代码
 1 DataTable orders = ds.Tables["SalesOrderHeader"];
2
3  // Query the SalesOrderHeader table for orders placed
4  // after August 8, 2001.
5  IEnumerable<DataRow> query =
6 from order in orders.AsEnumerable()
7 where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
8 select order;
9
10  // Create a table from the query.
11  DataTable boundTable = query.CopyToDataTable<DataRow>();
12
13  // Bind the table to a System.Windows.Forms.BindingSource object,
14  // which acts as a proxy for a System.Windows.Forms.DataGridView object.
15  bindingSource.DataSource = boundTable;
复制代码 复制代码

但也不应滥用.ToList(),当你需要操作结果的时候,用.ToList(),否则,如果仅仅是用来查询不需要进一步使用结果集,并可以延迟执行,就用.AsEnumerable()/IEnumerable /IQueryable,例如下例:

复制代码 复制代码
 1 using (BlogDbContext context = new BlogDbContext())
2 {
3 var result = (from e in context.BlogEntries
4 join t in context.PostTexts
5 on e.ID equals t.ID
6 where e.ID == entryId
7 select new
8 {
9 Title = e.Title,
10 Body = t.Text
11 })
12 .ToList()
13 .Select(e => new BlogEntry() { Title = e.Title, Body = e.Body })
14 .FirstOrDefault();
15 }
复制代码 复制代码 该例子中的中间结果并没有使用,所以.ToList()可以改为.AsEnumerable()。

.AsEnumerable() 和 .ToList() 的区别:

  • .AsEnumerable()延迟执行,不会立即执行。当你调用.AsEnumerable()的时候,实际上什么都没有发生。
  • .ToList()立即执行
  • 当你需要操作结果的时候,用.ToList(),否则,如果仅仅是用来查询不需要进一步使用结果集,并可以延迟执行,就用.AsEnumerable()/IEnumerable /IQueryable
  • .AsEnumerable()虽然延迟执行,但还是访问数据库,而.ToList()直接取得结果放在内存中。比如我们需要显示两个部门的员工时,部门可以先取出放置在List中,然后再依次取出各个部门的员工,这时访问的效率要高一些,因为不需要每次都访问数据库去取出部门。
  • IQueryable实现了IEnumberable接口。但IEnumerable<T> 换成IQueryable<T>后速度提高很多。原因:
  • IQueryable接口与IEnumberable接口的区别:  IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
  • IEnumerable跑的是Linq to Object,强制从数据库中读取所有数据到内存先。

 

复制代码 复制代码
 1 namespace System.Linq
2 {
3 public interface IQueryable : IEnumerable
4 {
5 Type ElementType { get; }
6
7 Expression Expression { get; }
8
9 IQueryProvider Provider { get; }
10 }
11
12 public interface IQueryable<out T> : IEnumerable<T>, IQueryable, IEnumerable
13 {
14 }
15 }
复制代码

标签:ToList,IQueryable,AsEnumerable,IEnumerable,LINQ,query,执行
From: https://www.cnblogs.com/itjeff/p/17392478.html

相关文章

  • .AsEnumerable()和.ToList()的区别
    .AsEnumerable()延迟执行,不会立即执行。当你调用.AsEnumerable()的时候,实际上什么都没有发生。.ToList()立即执行当你需要操作结果的时候,用.ToList(),否则,如果仅仅是用来查询不需要进一步使用结果集,并可以延迟执行,就用.AsEnumerable()/IEnumerable /IQueryable.AsEnumerable()......
  • C#-Linq
    linq可以对多种数据源和对象进行查询,如数据库、数据集、XML文档、数组等。通过对linq的使用,可以减少代码量并优化检索操作。LINQ关键字from指定数据源和范围变量where根据布尔表达式(由逻辑与或等组成)从数据源中筛选元素select指定查询结果中的元素所具有的类型或表......
  • Linq大白话深入浅出从零基础到手写开源工具兵贵神速系列(一)——为啥需要Linq
    所有的技术创新都是为了解决编程实践中的难点和痛点!如果我们不懂得这项技术所要解决的难点和痛点,我们在使用这项技术的时候就很可能走偏,在细节末节上隔靴搔痒,耗费很长的时间还掌握不了这项技术的精髓!而很多道友虽然在项目中掌握了一些基本的用法但是知其然而不知其所以然,不知道......
  • linq(lambd) 追加表达式 linqkit
    动态组合表达式谓词假设您要编写实现SQL的LINQtoSQL或实体框架查询关键字样式搜索。换句话说,返回其行的查询描述包含给定集合的部分或全部的关键字。我们可以按以下步骤进行:IQueryable<Product>SearchProducts(paramsstring[]keywords){IQueryable<Product>q......
  • linq的妙用 分组 交换索引
    //////Splitsacollectionofobjectsintonpageswithan(forexample,ifIhavealistof45shoesandsay'shoes.Split(5)'Iwillnowhave4pagesof10shoesand1pageof5shoes.//////Thetypeofobjectthecollectionshouldcontain.......
  • What's PLinq? how to use it?
    What'sPLinq?howtouseit?PLinqstandsfor"ParallelLINQ",whichisaparallelimplementationofLINQ(Language-IntegratedQuery)in.NET.ItallowsdeveloperstoperformLINQqueriesinparallelbyautomaticallypartitioningtheinput......
  • Linq专题之提高编码效率—— 第一篇 Aggregate方法
    的几个方法,这个系列我会带领大家看遍linq,好的,废话不多说,先从Aggregate这个貂毛说起。 一:应用场景前不久在写一个项目的时候,我需要捞取营销活动,刚好营销活动有两个类型,一种是普通活动,一个是触发式活动,由于存放在两张表中,并且捞取之后需要做一些实体的转存,等等计算,所以就有了类......
  • Linq专题之提高编码效率—— 第二篇 神一样的匿名类型
    说起匿名类型,我们都知道这玩意都是为linq而生,而且匿名类型给我们带来的便利性大家在实战中应该都体会到了,特别适合于一次性使用,临时使用这些场景,虽然说是匿名类型,也就是说是有类型的,只是匿名了而已,对吧,这篇我们就来探索下匿名类型到底和linq有多大关系呢???......
  • C#版本LINQ增强开源库
    LINQ对应的中文名称是:语言集成查询,是对一系列直接将查询功能集成到C#语言技术的统称,我们最常用的场景是,用于数据库的查询功能。在.Net中,本身对Objects也支持LINQ的扩展,但是对于一些特定的功能,就需要我们自己去扩展。所以,今天给大家推荐一个LINQ扩展库,主要是针对“LINQtoObject......
  • 在LINQPad中使用FreeSql查询数据库
    如何在LINQPad中使用FreeSqlLINQPad是一款强大的C#交互式编程环境,它可以让你轻松地编写和测试C#代码片段。除了作为一个交互式编程环境,LINQPad还可以用来连接各种数据源,包括SQL数据库、NoSQL数据库、Web服务等等。此外,LINQPad还支持使用NuGet包管理器来安装和管理第三方库。有时......