linq groupby月份并将任何缺失的月份添加到分组数据中

时间:2011-02-22 10:36:27

标签: c# linq

我创建了一个似乎正常工作的linq语句。我可能会或可能没有正确地写出来,但它会返回我预期的结果。

     var grouped = RewardTransctions.GroupBy(t => new
        {
            t.PurchaseDate.Value.Month
        }).Select(g => new TransactionDetail()
        {
            Month =
                g.Where(w=>w.EntryType==1).Select(
                    (n =>
                     n.PurchaseDate.Value.Month))
                .First(),
            TransactionAmount = g.Count()
        });

现在结果返回按月分组的5个值。是否可以向TransactionAmount = 0添加其他7个缺失的月份?

我疯狂的原因是我试图将这些值绑定到图表并使我的x轴基于月份。目前它只显示了5个月的记录。如果我的数据在一个月内没有返回任何值,我就会想要添加0值。

有什么建议吗?

4 个答案:

答案 0 :(得分:5)

如果您使用.ToLookup(...),则非常简单。

var lookup =
    (from w in RewardTransctions
     where w.EntryType == 1
     select w).ToLookup(w => w.PurchaseDate.Value.Month);

var grouped =
    from m in Enumerable.Range(1, 12)
    select new TransactionDetail()
    {
        Month = m,
        TransactionAmount = lookup[m].Count(),
    };

对于几个简单的LINQ查询,这是怎么回事?

答案 1 :(得分:1)

当您使用LINQ to Objects时,此查询应该可以解决问题:

var grouped = 
    from month in Enumerable.Range(1, 12)
    select new TransactionDetail()
    {
        Month = month,
        TransactionAmount = RewardTransactions
            .Where(t => t.PurchaseDate.Value.Month == month).Count()
    };

RewardTransactionsIQueryable时,您应首先致电AsEnumerable()

答案 2 :(得分:0)

为什么不这样做:

var grouped =
    RewardTransctions.GroupBy(t => t.PurchaseDate.Value.Month).Select(
        g => new TransactionDetail { Month = g.Key, TransactionAmount = g.Count() }).ToList();
for (var i = 1; i <= 12; ++i)
{
    if (grouped.Count(x => x.Month == i) == 0)
    {
        grouped.Add(new TransactionDetail { Month = i, TransactionAmount = 0 });
    }
}

这不完全是LINQ,而是直截了当。我还简化了你的LINQ查询; - )

答案 3 :(得分:-1)

我想如果你不使用anonymoustype(var),但创建一个自定义类型并在你的查询上执行.ToList(),你可以在列表上使用.Add()并将图表绑定到列表。