我有一个带有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类型的网格。
答案 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));
}