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() };
当RewardTransactions
是IQueryable
,你应该首先调用它的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()并将图表绑定到列表。