使用视图模型优化相关数据查询
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));
}
我有一个 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));
}