多个请求而不是 EF Core 中的一个
Multiple request instead of one in EF Core
我有这个 select,我希望通过向 SQL 服务器发送一个命令来执行它,但我可以看到 10 秒的请求。我该如何解决?
我们有些公司有客户和订单。由于某些原因,订单在公司实体下。
var q = _dbContext.Companies
.Include(x => x.Customers)
.Include(c => c.Orders)
.Where(a => a.CompanyId == 123);
var total = await q.CountAsync();
q = q.OrderByDescending(x => x.CompanyCode)
.Skip((pageIndex - 1) * pageSize).Take(pageSize);
var res = await q.Select(x => new ResultDto()
{
CompanyCode = x.CompanyCode,
Customers = x.Customers
.Where(c => c.IsActive)
.Select(c => new CustomerDto()
{
FirstName = c.FirstName,
Surname = c.Surname,
Orders = x.Orders
.Where(o => o.IsOpen)
.Select(o => new OrderDto()
{
DateCreated = o.DateCreated
}).ToList()
}).FirstOrDefault(),
}).ToListAsync();
这是EF.NetCore优化。
当您的导航属性为 collection 时,您实际上无法实现一个查询。
我现在找不到任何链接,但这是设计使然。
一旦您在 select 内或 include 内的导航中有一个 collection,它将为每个根实体生成一个单独的查询。我认为的原因是这样的查询产生的冗余数据量。
如果结果中没有< 1000 行的大量数据,我建议保持原样。您会看到很多查询,但它们会非常快。
正如我所看到的,你在这里有分页,所以这应该不是问题。
否则,select 将您的 collection 分开并小心地将它们加入内存。
很遗憾,EF Core 没有其他方法
此外,我建议打开 EF 核心日志以了解早期发生的事情。我打赌 FirstOrDefault 会产生一些警告。
我有这个 select,我希望通过向 SQL 服务器发送一个命令来执行它,但我可以看到 10 秒的请求。我该如何解决?
我们有些公司有客户和订单。由于某些原因,订单在公司实体下。
var q = _dbContext.Companies
.Include(x => x.Customers)
.Include(c => c.Orders)
.Where(a => a.CompanyId == 123);
var total = await q.CountAsync();
q = q.OrderByDescending(x => x.CompanyCode)
.Skip((pageIndex - 1) * pageSize).Take(pageSize);
var res = await q.Select(x => new ResultDto()
{
CompanyCode = x.CompanyCode,
Customers = x.Customers
.Where(c => c.IsActive)
.Select(c => new CustomerDto()
{
FirstName = c.FirstName,
Surname = c.Surname,
Orders = x.Orders
.Where(o => o.IsOpen)
.Select(o => new OrderDto()
{
DateCreated = o.DateCreated
}).ToList()
}).FirstOrDefault(),
}).ToListAsync();
这是EF.NetCore优化。 当您的导航属性为 collection 时,您实际上无法实现一个查询。 我现在找不到任何链接,但这是设计使然。
一旦您在 select 内或 include 内的导航中有一个 collection,它将为每个根实体生成一个单独的查询。我认为的原因是这样的查询产生的冗余数据量。
如果结果中没有< 1000 行的大量数据,我建议保持原样。您会看到很多查询,但它们会非常快。
正如我所看到的,你在这里有分页,所以这应该不是问题。
否则,select 将您的 collection 分开并小心地将它们加入内存。
很遗憾,EF Core 没有其他方法
此外,我建议打开 EF 核心日志以了解早期发生的事情。我打赌 FirstOrDefault 会产生一些警告。