多个请求而不是EF Core中的一个

时间:2019-02-25 14:52:40

标签: .net-core ef-core-2.2

我有这个选择,希望可以通过向SQL Server发送一个命令来执行,但是我可以看到10s请求。我该如何解决?

我们有拥有客户和订单的公司。由于某些原因,订单属于公司实体。

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();

1 个答案:

答案 0 :(得分:1)

这是EF.NetCore优化。 当您的导航属性是集合时,您实际上无法实现一个查询。 我现在找不到任何链接,但这是设计使然。

一旦导航中的select或include包含一个集合,它将为每个根实体生成一个单独的查询。我相信原因是这种查询产生的冗余数据量。

如果结果中没有很多数据<1000行,我建议保留原样。您会看到很多查询,但查询速度很快。

据我所见,您在这里有分页,所以应该没问题。

否则,请分别选择您的收藏,然后将它们仔细地加入内存。

不幸的是,EF Core没有其他方法

此外,我建议将EF核心日志打开到尽早进行。我打赌FirstOrDefault会产生一些警告。