使用视图模型优化相关数据查询

Optimizing related data queries with a View Model

我有一个 Kendo UI MVC Core Orders 网格,其中包含一个可以有多个客户的 MultiSelectFor 列。一切正常,但我有超过 2000 条记录,所以显示我的列表真的需要很长时间,因为需要从多对多 table.

中获取相关数据

我首先在 EF 中使用数据库,因此我搭建了数据库模型。

这是 EF 生成的订单 table 的模型(我已经删除了不必要的代码):

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; }
}

我的订单客户视图模型:

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 服务器分析器中看到)。

我的 Kendo 网格是 Ajax batch(true) incell 类型的网格。

通过创建接口,查询似乎自动优化了。不是 Asp.net Core / EF Core 方面的专家,也许有人可以解释为什么这样做。

如果查询在控制器内部,页面需要 32 秒才能获得 return 数据,因为它对每一行进行单独查询。

如果查询通过接口运行,需要 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));
}