实体框架-不同方面-性能优化

时间:2020-04-11 11:45:21

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

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

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个数据库查询,并且由于“查询”非常复杂,因此会引起一些性能问题。是否有可能通过EF和单个数据库查询来实现这一点?

更新:EF Core 3.1版

1 个答案:

答案 0 :(得分: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
};