重构linq查询并在分组后返回单个

时间:2018-05-02 09:52:03

标签: c# asp.net linq

我有以下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()。

的组合,我还是没有设法找出最后一块拼图。

我知道答案很简单,但感谢任何帮助。

1 个答案:

答案 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);