我有一个名为Events的表,这些是EndDate
列的示例:
我试图从这些事件中提取数月,但我希望它们像: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
的事件。
答案 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
,我认为这是你想要的。
您可以将此查询附加到已过滤日期列表中;你需要给它一个日期列表,而不是你目前正在构建的任何匿名对象的列表。