Связывание множественного набора результатов из процедуры хранилища в один список - PullRequest
0 голосов
/ 17 сентября 2018

Я возвращаю три множественных результата из хранимых процедур и привязываю их к трем спискам (некоторые ограничения для возврата в виде единого набора результатов). Я хочу сделать один окончательный список, который содержит все данные списка.

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} ]

В настоящее время выполняется с каждым циклом. Сначала зацикливайте список заказов, а затем снова зацикливайте на клиенте и списке клиентов и проверяйте этот заказ содержит данные о клиенте и заказе клиента или нет. если он там, связывает данные, делая его нулевым.

Есть ли в любом случае сделать это, а не цикл foreach, потому что если это 1000 записей, 1000 раз будет внешний цикл и внутренний цикл тоже много раз, и это влияет на производительность.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вы можете присоединиться к списку 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
0 голосов
/ 17 сентября 2018

Я полагаю, вы получаете все наборы результатов из базы данных за один вызов в оба конца, и ваша проблема не в нескольких вызовах базы данных, а в производительности вложенных циклов и поисков по спискам.

Если это так. В этом случае вы можете преобразовать заказы и списки клиентов в словари для быстрого поиска O (1), а затем выполнить одиночный цикл for для OrderCustomerList, и в этом цикле получить требуемые данные о заказе или клиенте из словаря.

var orderDetails = result1.ToDictionary(order => order.orderid);
var customerDetails = result2.ToDictionary(customer => customer.customerid);
...
// get order by id.
var order = orderDetails[orderId];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...