Отдельные года-месяцы с Linq (юридическим лицам) - PullRequest
5 голосов
/ 04 ноября 2011

У меня есть набор сущностей Publications со свойством ReleaseDate.Я хотел бы получить список всех различных комбинаций года и месяца из этого набора с целью создания виджета нумерации страниц.

Желательно, чтобы я хотел получить список значений DateTime со значением дня 1для каждого отдельного года-месяца из набора моих публикаций:

IEnumerable<DateTime> DistinctYearMonths = from p in context.Publications.  .... ?

Как мне завершить этот запрос linq-to-entity?

Ответы [ 5 ]

13 голосов
/ 04 ноября 2011
IEnumerable<DateTime> DistinctYearMonths = context.Publications
    .Select(p => new { p.ReleaseDate.Year, p.ReleaseDate.Month })
    .Distinct()
    .ToList() // excutes query
    .Select(x => new DateTime(x.Year, x.Month, 1)); // copy anonymous objects
                                                    // into DateTime in memory

Промежуточный шаг для проецирования в анонимный тип необходим, потому что вы не можете напрямую проецировать в DateTime (конструкторы с параметрами не поддерживаются в проекциях в LINQ to Entities и свойствах Year и Month DateTime только для чтения, поэтому вы не можете установить их с синтаксисом инициализатора (new DateTime { Year = p.ReleaseDate.Year, ... } невозможно)).

2 голосов
/ 04 ноября 2011

Попробуйте следующий запрос:

(from p in publications
 select new DateTime(p.ReleaseDate.Year, p.ReleaseDate.Month, 1)).Distinct();
1 голос
/ 04 ноября 2011

Использование группировки по:

(from i in context.Publications
group i by new { i.ReleaseDate.Year, i.ReleaseDate.Month } into g
select g.Key).ToList().Select(i => new DateTime(i.Year, i.Month, 1));
0 голосов
/ 04 ноября 2011
var DistinctYearMonths = context.Publications
    .Select(x => new DateTime(x.ReleaseDate.Year, x.ReleaseDate.Month, 1))
    .Distinct()
    .ToList()

Мне больше нравятся цепные методы linq, чем длинная форма. Их намного легче читать по ИМО.

0 голосов
/ 04 ноября 2011
var DistinctYearMonths = (from p in context.Publications
                          select new DateTime(p.ReleaseDate.Year,
                                              p.ReleaseDate.Month,
                                              1)).Distinct();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...