【问题标题】:Distinct year-months with Linq (to entities)与 Linq 不同的年月(对实体)
【发布时间】:2011-11-04 14:50:14
【问题描述】:

我有一组具有 ReleaseDate 属性的 Publications 实体。为了创建分页小部件,我想从该集合中获取所有不同年份和月份组合的列表。

最好是我的出版物集中每个不同年份的日期为 1 的 DateTime 值列表:

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

如何完成这个 linq-to-entities 查询?

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:
    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 和 @987654325 的 YearMonth 属性中的投影不支持带参数的构造函数@ 是只读的,所以你不能用初始化语法来设置它们(new DateTime { Year = p.ReleaseDate.Year, ... } 是不可能的)。

    【讨论】:

    • 你赢了。并且 +1 以获得良好的解释 - 这里的所有其他答案在产生“System.NotSupportedException:LINQ to Entities 中仅支持无参数构造函数和初始化程序”方面是相似的。
    【解决方案2】:

    尝试以下查询:

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

    【讨论】:

    • 嗯。我收到“System.NotSupportedException:LINQ to Entities 中仅支持无参数构造函数和初始化程序”。当我把它放到 LinqPad 中时——有什么想法吗?
    • @Faust 这意味着ReleaseDate 没有在属性本身中初始化。像这样初始化 DateTime 和 List 类型的 POCO 属性是一个好习惯:public virtual List&lt;Profile&gt; Followers { get; set; } = new List&lt;Profile&gt;();public virtual DateTime CreatedDate { get; set; } = DateTime.UtcNow;
    【解决方案3】:

    使用分组方式:

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

    【讨论】:

      【解决方案4】:
      var DistinctYearMonths = context.Publications
          .Select(x => new DateTime(x.ReleaseDate.Year, x.ReleaseDate.Month, 1))
          .Distinct()
          .ToList()
      

      我更喜欢链式 linq 方法,而不是长格式。它们更容易阅读 IMO。

      【讨论】:

        【解决方案5】:
        var DistinctYearMonths = (from p in context.Publications
                                  select new DateTime(p.ReleaseDate.Year,
                                                      p.ReleaseDate.Month,
                                                      1)).Distinct();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-27
          • 2015-10-21
          • 1970-01-01
          • 2021-08-24
          • 1970-01-01
          • 1970-01-01
          • 2012-04-26
          • 1970-01-01
          相关资源
          最近更新 更多