1

我有一个场景,我需要检索按日期时间字段的月份分组的对象计数。

我发现以下帖子让我了解了其中的一部分......

Linq:按年和月分组,管理空月

...但是我需要列出从今天开始的前 12 个月以及每个月的对象数量,这就是我苦苦挣扎的地方。

我看过其他一些具有类似问题/解决方案的帖子,但我选择了上面的帖子,因为它也是生成任何月份计数为 0 的记录的要求。

感谢您在这方面提供的任何帮助。

编辑

好的,感谢 Enigmativity,我得到了进一步的帮助(感谢您抽出宝贵的时间!):

var news = from s in db.NewsItems
                   where s.SubmittedDate > first
                   select new 
                   {
                       Date = s.SubmittedDate,
                       Title = s.Title,
                   };

var grouping = from g in news.AsEnumerable()
                       select new NewsCountCollection
                       (
                           g.Date,
                           g.Title
                       );

var lookup = grouping.ToLookup(x => x.Month, x => x.Title);

var counts = from n in Enumerable.Range(-11, 12)
                    let Month = last.AddMonths(n)
                    select new
                    {
                        Month,
                        Count = lookup[Month].Count(),
                    };

var countList = from c in counts.AsEnumerable()
                        select new NewsCountMonthList
                        (
                            c.Month.ToString("MMMM"),
                            c.Count
                        );

...以及以下

public class NewsCountCollection
{
    public DateTime Month { get; set; }
    public string Title { get; set; }

    public NewsCountCollection(DateTime date, string title)
    {
        this.Month = new DateTime(date.Year, date.Month, 1);
        this.Title = title;
    }

}

public class NewsCountMonthList
{
    public string Month { get; set; }
    public int Count { get; set; }

    public NewsCountMonthList(string month, int count)
    {
        this.Month = month;
        this.Count = count;
    }
}

......虽然似乎效率很低......我不禁想到必须有比这更好的方法。我在正确的轨道上吗?

4

1 回答 1

2

这应该为你做:

var now = DateTime.Now;
var last = new DateTime(now.Year, now.Month, 1);
var first = last.AddMonths(-12);

var query =
    from s in somethings
    where s.DateTimeField >= first
    where s.DateTimeField < last
    select new
    {
        Month = new DateTime(s.DateTimeField.Year, s.DateTimeField.Month, 1),
        Something = s,
    };

var lookup = query.ToLookup(x => x.Month, x => x.Something);

var counts =
    from n in Enumerable.Range(-12, 12)
    let Month = last.AddMonths(n)
    select new
    {
        Month,
        Count = lookup[Month].Count(),
    };

您可能需要稍微摆弄一下,但结构应该是合理的。

于 2012-06-26T11:11:23.847 回答