2015-11-23 4 views
1

У меня есть объект, который выглядит следующим образом:GroupBy несколько столбцов в Linq с Take()

public class Entries 
{ 
    public Contract Contract { get; set; } 
    public int Year { get; set; } 
} 

public class Contract 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Я хочу, чтобы иметь возможность обращаться к базе данных и возвращает объект, который позволил бы мне сообщить о договоре данные, как это, где числа для каждого года на счету за этот год:

Contract ID/Name 2015  2016 
1 - ABC    12   4 
2 - XYZ    17   76 
3 - QRS    414  0 

Я начал с Linq, как это:

var results = context.Entries 
    .Include(x => x.Contract) 
    .GroupBy(x => new { x.Contract, x.Year }) 
    .Select(x => new { Contract = x.Key.Contract, Year = x.Key.Year, Count = x.Count() }) 
    .OrderBy(x => x.Contract.Number) 
    .Take(5).ToList(); 

Мне хотелось бы, чтобы этот единственный IQueryable настроил меня, чтобы подтолкнуть данные к объекту, который имитирует приведенную выше таблицу. У меня возникли проблемы с настройкой, из-за Take(). Я хочу показать только первые 5 результатов, но когда я применяю его, как я сделал выше, после группировки, используя приведенные данные примера, будет одна запись для ABC 2015 и одна запись для ABC 2016. Я не уверен лучший способ использовать GroupBy() и Take() вместе для достижения моей цели.

+0

Вы хотите, чтобы верхние 5 были основаны на чем? Что, если какой-то контракт имеет большую ценность в 2015 году, но 0 в 2016 году? – MarcinJuraszek

+0

@MarcinJuraszek Я хочу 5 результатов контрактов макс. – im1dermike

ответ

1

Вам нужна вложенная коллекция:

var results = context.Entries 
    .Include(x => x.Contract) 
    .GroupBy(t=>t.Contract) 
    .Select(t=>new{ 
     Contract=t.Key, 
     Years=t.GroupBy(s=>s.Year) 
      .Select(s=>new{ 
       Year=s.Key, 
       Count=s.Count() 
      }) 
     }) 
    .Take(5); 

Вы будете иметь IEnumerable пара контрактов/лет, где года является IEnumerable года/колом-пара с подсчетами в год.

+0

Это не нравится объявление 't' в словаре toDictionary lambda ... – im1dermike

+0

Исправлено. Это было в лямбде, которая уже определила. –

+0

Теперь я получаю «LINQ to Entities не распознает метод». System.Collections.Generic.Dictionary2 [System.Int32, System.Int32] ToDictionary ... 'exception. – im1dermike

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