我创建了一个似乎正常工作的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值。
有什么建议吗?
答案 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()
};
当RewardTransactions
为IQueryable
时,您应首先致电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()并将图表绑定到列表。