性能不佳 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 Size 和 Page 使用 Skip 和 Take索引.
Oy,只需在您的表上创建适当的索引,您的查询就会运行:
CREATE UNIQUE INDEX CUSTOMERS_CUSTOMER_ID
ON CUSTOMERS (CUSTOMER_ID)
CREATE INDEX ORDERS_CUSTOMER_ID
ON ORDERS (CUSTOMER_ID)
我需要有关我的申请的建议。
首先,我有两个模型代表两个表(没有真正的表)
客户(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 Size 和 Page 使用 Skip 和 Take索引.
Oy,只需在您的表上创建适当的索引,您的查询就会运行:
CREATE UNIQUE INDEX CUSTOMERS_CUSTOMER_ID
ON CUSTOMERS (CUSTOMER_ID)
CREATE INDEX ORDERS_CUSTOMER_ID
ON ORDERS (CUSTOMER_ID)