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

我创建了一个似乎正常工作的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值。

有什么建议?

如果你使用.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查询怎么样?

当您使用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()

为什么不这样做:

 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查询;-)

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