0

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

我首先在 EF 中使用数据库,所以我搭建了 db 模型。

下面是 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; }
}

我的订单客户视图模型:

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 批处理(真)incell 类型的网格。

4

1 回答 1

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));
}
于 2017-10-30T13:18:42.873 回答