2009-04-06 4 views
8

У меня есть список данных, например, так:Сведение Linq Group запрос

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

Я хочу, чтобы иметь возможность фильтровать данные таким образом, что для каждого уникального номера, если существует P строка, то она возвращается иначе Возвращается строка L. Таким образом, данные будут выглядеть следующим образом:

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

На данный момент у меня есть этот запрос, который работает отлично:

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; 

Есть ли лучший способ сделать это без использования дополнительного Еогеасп?

ответ

3

Почему бы вам не позвонить selectg.First()?

+0

Вы, должно быть, набрали это, когда я редактировал свою собственную реакцию, lc! +1! –

+0

Я так думаю. Мне также нравятся ваши вложенные запросы, они могут быть повторно использованы в любое время, когда вам нужно перебирать сложные запросы. –

+0

Спасибо. Это отлично работает. Теперь я понимаю часть «в g». –

10

Вы могли всегда гнездятся ваши запросы:

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; 

Я уверен, что это не единственный способ сделать это (или, возможно, даже лучше), но это обернуть «Еогеасп» вверх в один запрос.

Редактировать

В самом деле, вы можете упростить это вниз:

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

Это кажется, дает правильный результат.

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