2015-11-06 2 views
4

Я использую Entity Framework 6 и хочу сгруппировать некоторые данные с помощью GROUP BY. Я должен сортировать обе группы и данные внутри группы. Чтобы сделать все как можно проще, я написал минималистский пример.Сортировка в группе в Entity Framework

Предположим, у нас есть статьи с Created-Field (only Date). Я хочу сгруппировать все статьи, написанные в один день. И я хочу сгруппировать статьи внутри группы по Created-Field.

Это был мой подход:

var articleGroups = DBContext.Articles 
    .OrderByDescending(x => x.Created) 
    .GroupBy(x => x.Created) 
    .OrderByDescending(x => x.Key) 
; 

Группы упорядочиваются отлично, но упорядочение самой группы полностью игнорируется. Что я делаю не так?

+0

Не сказать, что это решение, но вы пробовали группировать и сортировать в памяти, а не в базе данных? (то есть добавить 'ToList()' перед 'GroupBy()'), работает ли он? – Jcl

+0

Я уже пробовал это, и он работает. Сортировка в памяти работает отлично, но это не решение для меня, так как мое приложение должно быть масштабируемым. Количество записей в моем приложении не совсем небольшое. –

+0

Btw, если это был Linq to Objects, ваш первоначальный подход к сортировке был бы совершенно приемлемым: 'Объекты IGrouping приводятся в порядке, основанном на порядке элементов в источнике, который создал первый ключ каждая IGrouping . Элементы в группировке выводятся в том порядке, в котором они появляются в источнике. '([Источник] (https://msdn.microsoft.com/en-us/library/vstudio/bb534501 (v = vs.100) .aspx)) В Linq to Entity это поведение не гарантируется, но зависит от поставщика. –

ответ

0

Если я правильно понял:

List<Articles> list = new List<Articles>() 
{ 
    new Articles(){DateCreated=new DateTime(2015, 1, 18), Smth="aa1"}, 
    new Articles(){DateCreated=new DateTime(2015, 1, 18), Smth="aa2"}, 
    new Articles(){DateCreated=new DateTime(2014, 1, 18), Smth="aa3"}, 
    new Articles(){DateCreated=new DateTime(2014, 1, 18), Smth="aa4"}, 
    new Articles(){DateCreated=new DateTime(2016, 1, 18), Smth="aa5"}, 
    new Articles(){DateCreated=new DateTime(2016, 1, 18), Smth="aa6"}, 
    new Articles(){DateCreated=new DateTime(2012, 1, 18), Smth="aa7"}, 
    new Articles(){DateCreated=new DateTime(2012, 1, 18), Smth="aa8"}, 
    new Articles(){DateCreated=new DateTime(2018, 1, 18), Smth="aa9"}, 
    new Articles(){DateCreated=new DateTime(2018, 1, 18), Smth="aa10"}, 
}; 
var yourQuery = (from p in list group p.DateCreated by p.DateCreated into g select new { ByDate = g.Key, GroupedColl=g.ToList() }).OrderBy(x=>x.ByDate); 

Статья Класс:

class Articles 
{ 
    public DateTime DateCreated { get; set; } 
    public string Smth { get; set; } 
} 

Где ByDate и GroupedColl ваши поля данных.

+0

Что такое «Автомобили» в этом контексте? Где вы сортируете группу? –

+0

@AlexanderSchmidt, пожалуйста, см. Мой обновленный ответ – StepUp

2

Спасибо за ответы. Кажется, что я только что нашел решение моей проблемы;)

var articleGroups = DBContext.Articles 
    .GroupBy(x => x.Created) 
    .Select(x => new { 
     Created = x.Key, 
     Items = x.OrderByDescending(y => y.Created) 
    }) 
    .OrderByDescending(x => x.Created) 
; 
1

Попробуйте это:

var articleGroups = DBContext.Articles 
    .GroupBy(x => x.Created, 
      (x, g) => new{Key=x, Group = g.OrderByDescending(c=>c.Created)}) 
    .OrderByDescending(x => x.Key); 

Этот пример использования подписи GroupBy с элементом и результат выбора использовать на объекты в группе.

+0

К сожалению, это не работает. 'g' не имеет метода OrderByDescending. Вы проверили свой код? –

+0

Я обновляю ответ. Написание кода без IDE не просто :) –

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