2015-04-01 42 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. 
}