与Linq(对实体)的不同年月

时间:2011-11-04 14:50:15

标签: c# linq entity-framework

我有一组具有ReleaseDate属性的Publications。为了创建分页小部件,我希望从这个集合中获取所有不同的year& -month组合的列表。

最好是,我想要一个DateTime值列表,每天从我的出版物集开始为1:

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

如何完成此linq-to-entities查询?

5 个答案:

答案 0 :(得分:13)

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和{{1}中的投影不支持具有参数的构造函数Month的属性是只读的,因此您无法使用初始化语法设置它们(DateTime是不可能的))。

答案 1 :(得分:2)

尝试以下查询:

(from p in publications
 select new DateTime(p.ReleaseDate.Year, p.ReleaseDate.Month, 1)).Distinct();

答案 2 :(得分:1)

使用分组依据:

(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));

答案 3 :(得分:0)

var DistinctYearMonths = (from p in context.Publications
                          select new DateTime(p.ReleaseDate.Year,
                                              p.ReleaseDate.Month,
                                              1)).Distinct();

答案 4 :(得分:0)

var DistinctYearMonths = context.Publications
    .Select(x => new DateTime(x.ReleaseDate.Year, x.ReleaseDate.Month, 1))
    .Distinct()
    .ToList()

我喜欢链式linq方法比长形式更好。他们更容易阅读IMO。