2009-04-06 29 views
8

ben şöyle verilerin bir listesi var:Düzleştirme Linq Grubu sorgu

ID AddressPurpose Address ... 
1 L 
1 P 
2 L 
2 P 
3 P 
3 L 
4 P 
4 L 
5 P 
6 L 

Ben verilere filtre edebilmek istiyorum böylece o zaman başka döndürülür P satır varsa her benzersiz numara için L sıra döndü. Yani veri aşağıdaki gibi görünecektir: Şu anda

ID AddressPurpose Address ... 
1 P 
2 P 
3 P 
4 P 
5 P 
6 L 

Ben çalışıyor bu sorguyu var: İlave foreach kullanarak olmadan bunu yapmak için daha iyi bir yolu

var query = from c in list 
      orderby c.AddressPurpose descending 
      group c by c.ID 
      into g 
       select g; 

var finalList = new List<Company>(); 
foreach (var list in query) 
{ 
    finalList.Add(list.First()); 
} 
return finalList; 

var mı?

var query = 
    from i in (
     from c in list 
     orderby c.AddressPurpose descending 
     group c by c.ID into g 
     select g) 
    select i.First(); 

return query; 

bu onu (ya da muhtemelen hatta en iyi) yapmak için tek yol değildir eminim ama bu senin "foreach" tamamlamayı kapsamaz:

cevap

3

Neden bunun yerine selectg.First() yapmıyorsunuz?

+0

Kendi nizamı düzenlerken bunu yazıyor olmalısınız, lc! 1! –

+0

Sanırım öyle. İç içe geçmiş sorgularınızı da seviyorum, karmaşık sorgularda yinelemeniz gereken her zaman yeniden kullanılabilirler. –

+0

Teşekkürler. Bu harika çalışıyor. Şimdi "g'ye" kısmını anlıyorum. –

10

Her zaman yuva sorgularınızın olabilir bir sorguya. Doğru sonuç vermek gibi görünüyor

var query = from c in list 
      orderby c.AddressPurpose descending 
      group c by c.ID into g 
      select g.First(); 

:

Düzenleme

Aslında, bu aşağı kolaylaştırabilir.

2
var finalList = list 
    .GroupBy(c => c.ID) 
    .Select(g => g.OrderByDescending(c => c.AddressPurpose).First()) 
    .ToList();