我已经为此苦苦挣扎了几天。我创建了一个报告来衡量员工对客户的访问(也称为“访问KPI”)。
该报告实际上是有效的,但是加载时间大约为10秒,这是我设法使用GroupBy语句解决的,而不是我定期创建列表,查询,再次查询,另一组列表并序列化为JSON来解决的问题。
我需要做的是非常“简单”的。我正在查询某个年份的一个月(例如:2014年8月),但是我需要检索之前2个月的信息,使用该示例,我需要2014年8月,2014年7月和2014年6月的数据。 8月份的信息,7月份的第二个信息,依此类推。使用GroupBy,我设法做到了,所以结果是这样的:
等等...
好吧,我很好,但是我需要始终检索3个期间,例如,由于用户2在该月没有进行任何访问,因此该结果例如USER 2没有7月份的信息。问题是我需要JULY列的结果全部为零以适合我的表/列布局(在HTML中)。像这样的东西:
我正在使用的LINQ语句:
var visitasGrouped = from visit in visits
group visit by visit.Author into visitsAuthor
orderby visitsAuthor.Key ascending
from visitsGroup in
(from visit in visitsAuthor
group visit by visit.DateScheduled.Month)
group visitsGroup by visitsAuthor.Key;
显然,count()部分是在foreach语句中计算的。
我们将不胜感激任何帮助,包括改进LINQ语句,任何C#/ LINQ魔术,使用Knockout或jQuery格式化接收到的JSON数组。一切。
多谢您的回覆。
无需编译器或进行任何测试即可执行此操作,但这应该可以使您走上正确的道路:
var months = Enumerable.Range(0, 2)
.Select(x => endDate.AddMonths(-1*x).Month))
.ToList();
var results = visits
.GroupBy(v => v.Author)
.SelectMany(v => months
.Select(m =>
new {
author = v.Key,
month = m,
reportedVisits = v.Count(v => v.Reported && v.DateScheduled.Month = m),
unreportedVisits = v.Count(v => v.Unreported && v.DateScheduled.Month = m),
});
请注意,如果访问是一个大数据集,这可能效率很低,而且我不知道这是否会愉快地转换为SQL。就像我说的那样,我的LINQ并不是很好。但是它向您显示了原理:那几个月不会来得很遥远,您需要自己指定它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句