【问题标题】:Entity Framework - Distinct Facets - Performance Optimization实体框架 - 不同方面 - 性能优化
【发布时间】:2020-04-11 11:45:21
【问题描述】:

假设我们有一个复杂的生成查询...

IQueryable<...> query = ... //something complex

然后我想返回多个“方面”,我当前的实现是......

        var facets = new 
        {
            Countries = query.Select(r => new { Id = r.CountryId, Name = r.Country.Name })
                .Distinct().ToList(),
            Regions = query.Select(r => new { Id = r.RegionId, Name = r.Region.Name })
                .Distinct().ToList(),
            ... //7 more facets
        };

有了这个实现,我有 9 个 ToList(),所以我会有 9 个 db 查询,并且由于“查询”非常复杂,它会导致一些性能问题。是否有可能使用 EF 和单个数据库查询来实现这一点?

更新:EF Core 3.1 版

【问题讨论】:

  • EF Core 版本?
  • EF Core 3.1 版

标签: c# performance entity-framework entity-framework-core distinct


【解决方案1】:

目前(EF Core 3.1)无法通过单一数据库查询实现所需的结果形状。

您可以尝试在内存中检索单个数据库查询所需的所有(不同)数据,然后使用 LINQ to Objects 检索“方面”。基本上在服务器和客户端评估上拆分查询,这在 EF Core 3.0 之前是隐式的,而在 EF Core 3.0+ 中必须是显式的。

例如

var data = query.Select(r => new 
{
    Country = new { Id = r.CountryId, Name = r.Country.Name }, // facet 1 data
    Region = new { Id = r.RegionId, Name = r.Region.Name }, // facet 2 data
    //... 7 more facets 
})
.Distinct() // with or w/o this depending on query performance vs result set size
.ToList();

var facets = new 
{
    Countries = data.Select(r => r.Country).Distinct().ToList(), // facet 1
    Regions = data.Select(r => r.Region).Distinct().ToList(), // facet 2
    //... 7 more facets
};

【讨论】:

  • 好的,谢谢,我想到了这个。第三种选择是将所有这些更改为存储过程。现在,我只是标记你的答案,希望 EF 将来会支持这一点。
猜你喜欢
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
相关资源
最近更新 更多