使用View Model优化相关数据查询

时间:2017-10-18 14:13:08

标签: sql-server-2012 kendo-grid asp.net-core-mvc kendo-ui-mvc ef-core-2.0

我有一个带有MultiSelectFor列的Kendo UI MVC Core Orders网格,可以拥有多个客户。一切正常,但我有超过2000条记录,所以显示我的列表需要很长时间,因为需要从多对多表中提取相关数据。

我首先使用数据库与EF,所以我支持数据库模型。

以下是EF生成的Orders表的模型(我删除了不必要的代码):

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

My 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探查器中看到)。

我的Kendo网格是一个Ajax批量(true)incell类型的网格。

1 个答案:

答案 0 :(得分:0)

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

如果查询在控制器内部,则页面需要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));
}