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



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

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版

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

不过,您可以尝试在内存中检索单个数据库查询所需的所有(不同的(数据,然后使用LINQ to Objects检索"facets"。基本上是在服务器和客户端评估上拆分查询,这在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
};

最新更新