【问题标题】:LINQ .Select() is quite slowLINQ .Select() 很慢
【发布时间】:2018-06-10 01:41:31
【问题描述】:

我正在使用 EF Core。我在数据库表 Articles 中有大约 2500 条记录。

在使用 EF 编译 SQL 的管理工作室中,我得到了一些 MS 的结果。在程序中大约 30 秒。 .Select() 是问题所在。不知道怎么优化了。

1:之前

List<Article> articles = await db.Articles.Select(x => new Article { Title = x.Title, Description = x.Description, Body = x.Body, Authors = x.Authors, PhotoAuthors = x.PhotoAuthors, Tags = x.Tags }).ToListAsync();

2:现在

List<Article> articles = await db.Articles.FromSql("SELECT [x].[Title], [x].[Description], [x].[Body], [x].[Authors], [x].[PhotoAuthors], [x].[Tags] FROM[Articles] AS[x]").Select(x => new Article { Title = x.Title, Description = x.Description, Body = x.Body, Authors = x.Authors, PhotoAuthors = x.PhotoAuthors, Tags = x.Tags }).ToListAsync();

结果还是一样的:/

编辑:解决方案是不使用 .ToList()

使用:

IQueryable<Article> articles = db.Articles.Select(x => new Article { Title = x.Title, Description = x.Description, Body = x.Body, Authors = x.Authors, PhotoAuthors = x.PhotoAuthors, Tags = x.Tags }).AsNoTracking();

IQueryable 丢失函数,例如我稍后使用的 .Split 或 Intersects。

【问题讨论】:

  • 我在 EF 6(非 Ef Core)性能方面遇到了很多困难,我注意到问题在于 SQL 结果映射到类。我正在研究一个遗留系统,无法解决建模错误以改善性能问题... =/ 现在我使用 Dapper,性能方面的一切都好得多。
  • 为什么需要选择 - db.Articles 不是返回 IQueryable&lt;Article&gt;
  • 好吧,我正在尝试选择必要的列。没有选择它也很慢..因为创建 2500 个对象
  • 您要寻找的最终结果是什么articles(或多少)?例如之后你会过滤你的文章吗?
  • 是的,然后我过滤文章。我需要使用 Split 函数来查看是否有任何关键字与单词匹配

标签: c# entity-framework linq select entity-framework-core


【解决方案1】:

我觉得你想多了。

var articles = db.Articles.ToList();

为您提供文章列表。如果你真的不想选择额外的字段,那么你可以做一个

var articles = db.Articles.Select(x => new {...}).ToList();

但一般来说,您不应该看到抓取整个标题与仅抓取部分标题之间有太大区别。您可能需要一个.Where 来限制事物,但如果您真的需要它,请保持简单。

【讨论】:

  • 我都需要。我正在做搜索功能
  • 不应该在数据库中进行搜索以避免拉回所有数据吗?想一想当您获得 10,000 或 100 万篇文章时会发生什么......
  • 你有什么建议?你会如何限制搜索功能?
  • 'Pagination' 将是您拥有大量记录集时的正确方法。
  • 如果你正在做一个搜索功能,你不应该拉回你的所有数据,在代码中搜索然后执行。这就是 .Where 的用途。在您的请求中限制您的标准。请求中没有什么不能做的,只有在你拥有所有数据后才能做。
【解决方案2】:

AsNoTracking() 应该让它更快

var articles = db.Articles.AsNoTracking().ToList();

【讨论】:

  • 试过了,还是没用:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2023-03-15
  • 2012-10-13
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多