2015-09-08 4 views
0

Я пытаюсь изменить нижний запрос Linq, чтобы вернуть первую подходящую строку для максимальной версии.Измените Linq, чтобы вернуть первое соответствующее значение

+----+------+---------+-----+ 
| PK | Name | Version | abc | 
+----+------+---------+-----+ 
| 1 | Bill |  1 | 7 | 
| 2 | Bob |  1 | 2 | 
| 3 | Ben |  1 | 3 | 
| 4 | Bob |  2 | 2 | 
| 5 | Ben |  2 | 3 | 
| 6 | Ben |  2 | 3 | 
+----+------+---------+-----+ 

В настоящее время он вернется:

+----+------+---------+-----+ 
    | PK | Name | Version | abc | 
    +----+------+---------+-----+ 
    | 1 | Bill |  1 | 7 | 
    | 4 | Bob |  2 | 2 | 
    | 5 | Ben |  2 | 3 | 
    | 6 | Ben |  2 | 3 | 
    +----+------+---------+-----+ 

Когда я хочу, чтобы вернуться:

+----+------+---------+-----+ 
| PK | Name | Version | abc | 
+----+------+---------+-----+ 
| 1 | Bill |  1 | 7 | 
| 4 | Bob |  2 | 2 | 
| 5 | Ben |  2 | 3 | 
+----+------+---------+-----+ 

var source = (from item in baseSource 
          where item.Version > 0 
          where item.Published       
          where db.abcTest.Where(it => it.Published && it.Name == item.Name).Max(it => it.Version) == item.Version        
          orderby item.Name, item.Version descending        
          select new 
          {       
           item.PK, 
           item.Name,         
           item.Version, 
           item.abc 
          } 
         ).ToList(); 
      return source; 
+0

может быть 'First()' или 'FirstOrDefault()'? –

+3

Вы читали о "group by"? – CodeCaster

ответ

1

Ниже код с помощью функции группы получили его работы

var source = (from item in baseSource 

          where item.Version > 0 
          where item.Published       
          where db.abcTest.Where(it => it.Published && it.Name == item.Name).Max(it => it.Version) == item.Version 

          orderby item.Name, item.Version descending 
          group item by new { item.Name, item.Version} into groupx 
          select new 
          {   
           PK = groupx.FirstOrDefault().PK, 
           groupx.Key.Name, 
           groupx.Key.Version, 
           abc= groupx.Select(it => it.abc.Count()).FirstOrDefault() 
          } 
         ).ToList(); 
      return source; 
+0

Если вы посмотрите внимательно, я тоже сделал то же самое;) –

+1

@RahulSingh Да, я вижу это сейчас, спасибо за ответ! – user3424480

1

Вам нужно GroupBy здесь: -

var result = baseSource.GroupBy(x => x.Name) 
       .Select(x => 
       { 
        var orderedObj = x.OrderByDescending(z => z.Version) 
             .ThenByDescending(z => z.abc).FirstOrDefault(); 
        return new 
          { 
           PK = orderedObj.PK, 
           Name = x.Key, 
           Version = orderedObj.Version , 
           abc = orderedObj.abc 
          }; 
       }; 

Рассмотрим проверки orderedObj для нулей, в противном случае это может привести к исключению Null Reference.

Смежные вопросы