0

我有一个Kendo UI MVC Core Orders网格,它有一个可以有多个客户的MultiSelectFor列。所有工作都很好,但我有超过2000条记录,所以显示我的列表需要很长的时间,因为需要从多对多表中提取相关数据。用View Model优化相关数据查询

我首先使用数据库与EF,所以我脚手架db模型。

这里是由EF产生的订单表的模型(我已删除不必要的代码):

public partial class Orders 
{ 
    public Orders() 
    { 
     OrdersCustomers = new HashSet<OrdersCustomers>(); 
    } 
    public int JobNo { get; set; } 
    public ICollection<OrdersCustomers> OrdersCustomers { get; set; } 
} 

我的视图模型OrdersVM(查看模型):

public class OrdersVM 
{ 
    public int JobNo { get; set; } 

    [UIHint("OrdersCustomersET")] 
    [Required(ErrorMessage = "A Customer is required")] 
    public IEnumerable<OrdersCustomersVM> OrdersCustomers { get; set; } 
} 

EF产生OrdersCustomers代码:

public partial class OrdersCustomers 
{ 
    public int JobNo { get; set; } 
    public string ClientId { get; set; } 
    public Customers Client { get; set; } 
    public Orders JobNoNavigation { get; set; } 
} 

我OrdersCustomers视图模型:

public class OrdersCustomersVM 
{ 

    public int JobNo { get; set; } 
    public string ClientName { get; set; } 
    public string ClientId { get; set; } 
} 

我的控制器:

public IActionResult Read([DataSourceRequest] DataSourceRequest request) 
    { 
     var List = _context.Orders 
      .Select(c => new OrdersVM 
      { 
       JobNo = c.JobNo, 
       OrdersCustomers = c.OrdersCustomers.Select(t => new OrdersCustomersVM 
       { 
        ClientId = t.ClientId, 
        ClientName = t.Client.ClientName 
       }), 
      }).OrderByDescending(c => c.JobNo).Where(r =>r.OfficeId == _getempinfo.GetOID(User.Identity.Name); 

     return Json(List.ToDataSourceResult(request)); 
    } 

我想与任何缓存等优化我的代码,因为它是没有意义的,有这么多的SQL查询(我可以看到SQL Server Profiler中) 。

我的剑道网格是一个Ajax批处理(true)网格类型的网格。

回答

0

通过创建一个接口,查询自动优化似乎。不是在Asp.net核心/ EF核心专家,也许有人可以解释为什么它这样做。

如果查询位于控制器内,则该页面需要32秒才能返回数据,因为它会为每行分别查询。

如果查询通过接口运行,则需要947毫秒。

public interface IOrdersService 
{ 
    IEnumerable<Orders> GetAll(); 
} 

public IEnumerable<Orders> GetAll() 
    { 
     return _context.Orders.AsNoTracking().Include(o => o.OrdersCustomers).ThenInclude(o =>o.Client); 

    } 

然后在控制器:

public IActionResult Read([DataSourceRequest] DataSourceRequest request) 
{ 
    var orders = _orderservice.GetAll(); 

    var vm = orders.Select(c => new OrdersVM 
     { 
      JobNo = c.JobNo, 
      OrdersCustomers = c.OrdersCustomers.Select(t => new OrdersCustomersVM 
      { 
       ClientId = t.ClientId, 
       ClientName = t.Client.ClientName 
      }), 
     }).OrderByDescending(c => c.JobNo).Where(r =>r.OfficeId == _getempinfo.GetOID(User.Identity.Name); 

    return Json(vm.ToDataSourceResult(request)); 
}