Entity Framework - 不同的方面 - 性能优化
Entity Framework - Distinct Facets - Performance Optimization
假设我们有一个复杂的生成查询...
IQueryable<...> query = ... //something complex
然后我想 return 多个 "facets" 并且我当前的实现是...
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 个数据库查询,并且由于 "query" 非常复杂,它会导致一些性能问题。有没有可能用 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
};
假设我们有一个复杂的生成查询...
IQueryable<...> query = ... //something complex
然后我想 return 多个 "facets" 并且我当前的实现是...
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 个数据库查询,并且由于 "query" 非常复杂,它会导致一些性能问题。有没有可能用 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
};