【问题标题】:How to optimize a entity framework query which uses "Contains" method [duplicate]如何优化使用“包含”方法的实体框架查询[重复]
【发布时间】:2020-03-29 06:19:53
【问题描述】:

我有一个 c# 代码,在其中我使用 LINQ 查询通过将字符串类型的特定属性与字符串列表进行比较来检索一堆对象。 c#代码如下:

var list = new List<string>{.....}
var query = from record in context.Records.AsNoTracking()
                        where list.Contains(record.Name)
                        orderby record.Name
                        select new 
                        {
                            ...
                        };

var result = query.ToList();

我的问题是,当列表很大时,此查询的性能会非常低,在某些情况下需要几分钟才能返回结果。

我需要知道提高此查询性能的可能解决方案是什么?

【问题讨论】:

  • 我怀疑您需要将查询分解为更小的块。另外,看看是否在内存中进行排序,即在你到 ToList 之后调用 .OrderBy (因为这现在将在内存中排序)可能会有所帮助

标签: c# performance entity-framework linq


【解决方案1】:

此请求将数据库中的每一行与集合中的每个项目进行比较。

  • 为 record.Name 添加索引以过滤和排序名称
  • 使用前对列表集合进行排序

在每个步骤之后分别测量请求性能。

  • 查看在启动请求之前使用 sql 存储中的临时表来存储列表项的可能性
  • 可以使用 LinqPad 将 linq 请求转换为 sql 请求以查看其性能。

如果您受到 Linq 性能的困扰并且非常了解 SQL,则可以将 Dapper 用于读取请求和报告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多