为什么按年订单不起作用?

时间:2012-11-20 08:58:12

标签: c# linq

我有一个名为Events的表,这些是EndDate列的示例:

enter image description here

我试图从这些事件中提取数月,但我希望它们像:11, 12, 1(当年11和12,明年1 - 2013)。

var ev = db.Events.Select(d => new { Month = d.StartDate.Value.Month, 
                                     EndDate = d.EndDate })
                  .Where(d => (d.EndDate >= DateTime.Now
                           || (   d.EndDate.Value.Day == DateTime.Now.Day 
                               && d.EndDate.Value.Month >= DateTime.Now.Month) ))
                  .OrderBy(d => d.EndDate.Value.Year)
                  .Select(d => new { Month = d.Month }).Distinct();

好吧,我不明白为什么这个查询不起作用。它将月份提取为:1, 11, 12当然,这不是我想要的......

Ps:您可以忽略where子句,即只过滤来自now on的事件。

4 个答案:

答案 0 :(得分:3)

您正在按年份.OrderBy(d => d.EndDate.Value.Year)排序,但您可能希望按d.EndDate.Value排序

年份将忽略日期的任何日期/月份...因此列表中的“第一个”2012是第一个项目。

    var events = new List<DateTime>
    {
        new DateTime(2013,11,1),
        new DateTime(2013,5,1),
        new DateTime(2013,4,1),
        new DateTime(2012,12,29),
        new DateTime(2012,12,28)
    };

    var ev = events.Select(d => new { Month = d.Month, Date = d })
        .Where(d => (d.Date >= DateTime.Now || (d.Date.Day == DateTime.Now.Day && d.Date.Month >= DateTime.Now.Month)))
        .OrderBy(d => d.Date.Year)
        .Select(d => new { Month = d.Month })
        .Distinct();

将返回12,11,5,4

var ev = events.Select(d => new { Month = d.Month, Date = d })
                .Where(d => (d.Date >= DateTime.Now || (d.Date.Day == DateTime.Now.Day && d.Date.Month >= DateTime.Now.Month)))
                .OrderBy(d => d.Date)
                .Select(d => new { Month = d.Month })
                .Distinct();

将返回12,4,5,11

答案 1 :(得分:1)

这可能不是它,但我在Enumerable.Distinct()的文档中看不到任何保证任何给定顺序的结果。您可能希望重新查询您的查询以检查是否是这种情况。

答案 2 :(得分:1)

将Order语句更改为:

  

.OrderBy(d =&gt; d.EndDate.Value.Year).ThenBy(d =&gt;   d.EndDate.Value.Month)

答案 3 :(得分:0)

如果您有一个日期的枚举,并且只想获得月份数字,那么您可以按顺序执行以下操作:

var months = dates
    .Select(d => new { Month = d.Month, Year = d.Year })
    .Distinct()
    .OrderBy(a => 12 * d.Year + d.Month)
    // or .OrderBy(a => a.Year).ThenBy(a => a.Month)
    .Select(a => a.Month);

请注意{/ 1}} 之前 之前调用,这意味着例如Distinct将返回1/1/2011, 5/5/2011, 1/1/2012,我认为这是你想要的。

您可以将此查询附加到已过滤日期列表中;你需要给它一个日期列表,而不是你目前正在构建的任何匿名对象的列表。