性能不佳 ASP.NET MVC ViewModel

Bad performance ASP.NET MVC ViewModel

我需要有关我的申请的建议。

首先,我有两个模型代表两个表(没有真正的表)

客户(135K 行 | 40 列)

+-------------+--------+------------+
| CUSTOMER_ID |  NAME  | FIRST_NAME |
+-------------+--------+------------+
|        1234 | DUPONT | JEAN       |
+-------------+--------+------------+

订单

+-------------+----------+-------+
| CUSTOMER_ID | ORDER_ID | TYPE  |
+-------------+----------+-------+
|        1234 |     5678 | MEET  |
|        1234 |     9105 | CANDY |
|        2568 |     7523 | CANDY |
+-------------+----------+-------+

我想获得一位客户的订单清单。

所以我创建了一个 Viewmodel :

public class ViewModel
{
    public string CustomerID { get; set; }
    public string Name  { get; set; }
    public string FirstName { get; set; }
    public List<OrdersViewModel> Orders { get; set; }

    public ViewModel(){Orders = new List<OrdersViewModel>(); 
}

现在查询:

var query = from c in northwind.CUSTOMERS
            select new ViewModel()
                       {
                           CustomerID = c.CustomerID,
                           Name = c.Name,
                           FirstName = c.FirstName
                       };
var CustomersModels = query.ToList();
var queryOrders = from c in northwind.CUSTOMERS
                  join o in northwind.ORDERS
                  on c.CustomerID  equals o.CustomerID 
                  select new OrdersViewModel()
                             { 
                                 CustomerID = d.CustomerID,
                                 OrderId= d.OrderId,
                                 Type= d.Type
                             };
var modelsOrders = queryOrders .ToList();

foreach (ViewModel item in modelsOrders )
{
    var listModels = modelsOrders .Where(e => e.PMRQTOTM ==  item.PMRQTOTM).ToList();
    item.Orders = listModels;
}

有没有更好的实现方式?

我在不到 30 秒的时间内收到了 CustomerModel 但订单需要几分钟...

如果 Customer 和 Order 有关系,您可以在第一个查询中使用 Include

即便如此,您也不应一次查询 135K。相反,您想根据 Page SizePage 使用 SkipTake索引.

Oy,只需在您的表上创建适当的索引,您的查询就会运行:

CREATE UNIQUE INDEX CUSTOMERS_CUSTOMER_ID
ON CUSTOMERS (CUSTOMER_ID)

CREATE INDEX ORDERS_CUSTOMER_ID
ON ORDERS (CUSTOMER_ID)