我有以下linq查询:
var q = Queryable.First(Queryable.Select(r.Find((Expression<Func<Application, bool>>)((Application x) =>
x.IsValid && x.CreatedOn < startDate && x.CreatedOn >= endDate))
.GroupBy((Expression<Func<Application, int>>)((Application x) => (int)1))
, (IGrouping<int, Application> g) => new
{
AvgApplicationTime = (int)Math.Round(g.Average((Application i) => i.ApplicationTime)),
AvgDecisionTime = (int)Math.Round(g.Average((Application i) => i.DecisionTime)),
ApprovalRate = 100.0 * g.Count<Application>((Application i) => i.IsAccepted) / g.Count<Application>()
}));
return new ApplicationStats((int)q.AvgApplicationTime, (int)q.AvgDecisionTime, q.ApprovalRate);
我很确定查询可以简化并且已经开始这样做了。
我的方法总是尝试理解我正在使用的查询,而不仅仅是黑客攻击并希望它有效。
这样做,我喜欢在重新组装之前将其分解为部分,我试图在这里做:
var q1 = r.Find(x => x.CreatedOn < startDate && x.CreatedOn >= endDate);
var q2 = q1.Select(x => x.Applicant);
var q3 = q2.GroupBy(x => 1, (g) => new ApplicationStats(1, 1, 0.75)); // I've omitted some bits for brevity
// q4 = ??? // Needs to return a single Applicationstats()
不幸的是,尽管使用了.Select(),. SelectMany(),。first()。
的组合,我还是没有设法找出最后一块拼图。我知道答案很简单,但感谢任何帮助。
答案 0 :(得分:1)
新查询存在许多问题。
bommelding是正确的 - 拼图的最后一点是q4 = q3.First()
,
但是,如果没有对此声明进行其他更改,这将无效:
var q3 = q2.GroupBy(x => 1, (key, g) => new
{
AvgFormCompletionTime = 360,
AvgProcessingTime = 90,
ApprovalRate = .75
});
首先&#39;关键&#39;添加了(g),(key,g)。
其次,linq只接受无参数构造函数,我的问题就是没有。
为了转换最终的匿名属性,我在最后添加了这个语句:
return new ApplicationStats(q4.AvgFormCompletionTime, q4.AvgProcessingTime, q4.ApprovalRate);