将存储过程中的多个结果集绑定到一个列表中

时间:2018-09-17 12:21:52

标签: c# performance entity-framework linq stored-procedures

我要从存储过程中返回三个多重结果集,并将其绑定到三个列表中(将某些限制作为单个reslt集返回)。 我想做一个包含所有列表数据的最终列表。

Ex :
Resultset1(OrderList)

Orderid customerid ordernumber ordername

Resultset2(CustomerList)

orderid customerid customernumber customername

Resultset3(OrderCustomerList)  
orderid customerid productname cost

将此结果集分配到每个列表中。

我想要下面的最终列表,如果该订单有客户详细信息,我想绑定客户详细信息,否则类似 有关产品的详细信息。

Final list

orderid : 1234,
customerid :as12,
ordernumber : 23456,
ordername : "xyz",
customerdetails : [{ "key" : "customernumber" "value" : 1234 },{ "key" : 
"customername" "value" : "abc" } ],
productdetails : [{ "key" : "productname" "value" : "west" },{ "key" : 
"cost" "value" : 90} ]

当前每个循环都使用。首先循环订单列表,然后再次循环客户和订单客户列表,并检查是否 该订单是否包含客户和订单客户数据。如果有,则绑定数据,否则将其设置为null。

总有办法做到这一点,而不是foreach循环,因为如果它是1000条记录,那么将进行1000次外循环,而也会进行内循环 很多次,这会影响性能。

2 个答案:

答案 0 :(得分:0)

我想您可以通过一次往返调用从数据库中获取所有结果集,而您的问题不是多次数据库调用,而是嵌套for循环和列表查找的性能。

如果这是真的,那么您可以将订单和客户列表转换为字典以进行快速查找O(1),然后对OrderCustomerList进行单次for循环,然后在该循​​环中从字典中获取所需的订单或客户详细信息。

var orderDetails = result1.ToDictionary(order => order.orderid);
var customerDetails = result2.ToDictionary(customer => customer.customerid);
...
// get order by id.
var order = orderDetails[orderId];

答案 1 :(得分:0)

您可以加入3个列表,然后选择所需的任何内容:

var query = from order in Resultset1
            join cust in Resultset2
            on order.orderid equals cust.orderid && order.customerid equals cust.customerid 
           select new { cust.orderid, cust.customerid, cust.customernumber, cust.customername, order.ordernumber, order.ordername} into mid
           join ocl in Resultset3
            on mid.orderid equals ocl.orderid && mid.customerid equals ocl.customerid 
           select new {
               mid.orderid, 
               mid.customerid, 
               mid.customernumber, 
               mid.customername, 
               mid.ordernumber, 
               mid.ordername,
               ocl.productname 
}

如果orderid是唯一的,那么您可以像

一样加入
on order.orderid equals cust.orderid

代替

on order.orderid equals cust.orderid && order.customerid equals cust.customerid