如何使用LINQ在列表中生成重复项?

时间:2016-10-07 09:47:28

标签: c# linq

这是我使用的LINQ查询

var result = (from price in inventoryDb.Pricing.AsNoTracking()               
              where price.Quantity > 0m
              select new
              {
                 TagNo = price.TagNo,
                 SellingRate = price.SellingRate,
                 Quantity = price.Quantity           
              }).ToList();

基于Quantity值,我需要在列表中生成重复的项目。

输出

result = [0]{TagNo="100", SellingRate=1500.00, Quantity=1}
         [1]{TagNo="101", SellingRate=1600.00, Quantity=2}

预期结果:

result = [0]{TagNo="100", SellingRate=1500.00}
         [1]{TagNo="101", SellingRate=1600.00}
         [2]{TagNo="101", SellingRate=1600.00}

2 个答案:

答案 0 :(得分:9)

您可以使用Enumerable.SelectMany + Enumerable.Range

var result = inventoryDb.Pricing.AsNoTracking()
    .Where(p => p.Quantity > 0m)
    .SelectMany(p => Enumerable.Range(0, p.Quantity)
        .Select(i => new
              {
                 TagNo = p.TagNo,
                 SellingRate = p.SellingRate      
              }))
    .ToList();

如果您的LINQ提供程序(f.e. Linq-To-Entities)不支持,最简单的方法是使用Linq-To-Objects。为避免将所有内容加载到内存中,您应在AsEnumerable之后使用Where

var result = inventoryDb.Pricing.AsNoTracking()
    .Where(p => p.Quantity > 0m)
    .AsEnumerable()
    .SelectMany(p => Enumerable.Range(0, p.Quantity)
        .Select(i => new
              {
                 TagNo = p.TagNo,
                 SellingRate = p.SellingRate      
              }))
    .ToList();

答案 1 :(得分:4)

保持查询语法只需添加Enumerable.Repeat,如下所示:

var result = (from price in inventoryDb.Pricing.AsNoTracking()
              where price.Quantity > 0m
              from dup in Enumerable.Repeat(0,price.Quantity)
              select new
              {
                 TagNo = price.TagNo,
                 SellingRate = price.SellingRate,          
              }).ToList();

如果确实linq to entities不支持,则添加AsEnumerable,如下所示:

var result = (from price in inventoryDb.Pricing.AsNoTracking()
                                               .Where(p => p.Quantity > 0m)
                                               .AsEnumerable() //Loads only the filtered items to memory            
              from dup in Enumerable.Repeat(0,price.Quantity)
              select new
              {
                 TagNo = price.TagNo,
                 SellingRate = price.SellingRate,          
              }).ToList();

您也可以使用Enumerable.Range但是因为您没有使用该集合的值(在我看来也只是它更好地描述了您正在做的事情)我决定只使用{{ 1}}