2015-04-01 56 views
0

我有兩個列表:C# - 鏈接兩個列表有效

  1. 產品
  2. 含 價格的產品和倉庫組合的列表/數量等的SQL查詢

兩個不同的結果。

第二個列表有一個'ProductId'。

什麼我目前做的是:

foreach(var product in Products) 
    var productWarehouses = Warehouses.Where(x=> x.ProductId == productId).ToList(); 
    product.Warehouses = productWarehouses; 

事情是,這需要很長很長。

注意:我已經嘗試將產品拆分成大量的列表,並使用Parallel.Foreach()和Tasks來縮短時間 - 但仍然需要很長時間。

回答

1

使用Join,而不是通過一個集合的全部爲其他集合中的每個項目做線性搜索:

var query = from product in Products 
    join warehouse in Warehouses 
    on product.productId equals warehouse.ProductId 
    into warehouses 
    select new 
    { 
     product, 
     warehouses, 
    }; 
+0

我的反應就像我F10那樣 - [link](https://s-media-cache-ak0.pinimg.com/736x/98/2a/eb/982aebe2d39aaf5c291f64f526166066.jpg)。 嚴重壽 - 謝謝:)如果你還在這裏 – 2015-04-01 16:16:22

+0

快速的問題 - 是否有可能沿着 '選擇產品 { 倉庫= warehouses' 而不是映射的所有產品領域的線路做一些事情: '選擇新ProductCustomClass(){ 的ProductId = product.ProductId,' ......我想結束了一個List 而不是List 2015-04-01 16:27:01

+0

@AlanCiantar試一試,看看會發生什麼。如果你想*改變產品*,那麼你應該在'foreach'中做,而不是使用LINQ。 LINQ用於查詢。如果您只想使用LINQ,請將查詢投影到具有適當值的新產品實例中。 – Servy 2015-04-01 16:27:30

0

而不是在c#中這樣做,我寧願在SQL存儲過程中做到這一點。從一個sql獲取所有詳細信息,然後遍歷結果以創建產品列表。

0

創建一個從您的Products一個Dictionary<int, Product>其中Product.ProductID作爲重點:

var pd = Products.ToDictionary(p => p.ProductID, p => p); 

然後您可以迭代倉庫並快速查找適當的產品:

foreach (var wh in Warehouses) 
{ 
    pd[wh.ProductId].Warehouses.Add(wh); //supposed Product.Warehouses lists have already been created, if not, add checks and create them as needed. 
}