2016-10-07 20 views
11

bu ben listedeki yinelenen öğeleri oluşturmak gerekir Quantity değere dayanarak LINQ kullanarak bir listede yinelenen öğeler nasıl oluşturulur?

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

kullandık LINQ sorgusu olur.

Çıktı:

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

Beklenen Sonuç:

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

cevap

8

Sen Enumerable.SelectMany + Enumerable.Range kullanabilirsiniz:

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(); 

hiçbir buysa LINQ sağlayıcınız tarafından destekleniyor (ör. Linq-To-Entities), en kolay Linq-To-Objects kullanmaktır. aşağıdaki gibi sadece Enumerable.Repeat eklemek sorgusu sözdizimi ile tutulması

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(); 
4

: desteklemediği kişilere gerçekten linq

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(); 

Eğer tüm Where sonra AsEnumerable kullanmalıdır belleğe yüklenir önlemek için

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(); 

da kullanabilirsiniz: aşağıdaki gibi sonra AsEnumerable eklemek Enumerable.Range ama ben Nesneler çözeltisine bariz LINQ var Repeat

+1

ile gitmek sadece karar (o ne yaptığını daha iyi açıklanan Ayrıca sadece bence ve) o koleksiyonun değerini kullanmayın çünkü. Soru şu ki bu EF ile çalışır (uyarı 'inventoryDb.Pricing.AsNoTracking()'). 'NotSupportedException' üzerine bahis koyacağım :) –

+1

@IvanStoev, 'Enumerable.Repeat' çağırmadan önce' .AsEnumerable() 'ı ekleyin. – kiziu

+0

@IvanStoev - Fark ettiğin için teşekkürler :) haklısın ve bunu kontrol etmeyi unuttum. Güncelleme –

İlgili konular