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

C# 重构linq查询并在分组后返回单个,c#,asp.net,linq,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))

我有以下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 q=Queryable.First(Queryable.Select(r.Find)(表达式)((应用程序x)=>
x、 IsValid&&x.CreatedOn=endDate))
.GroupBy((表达式)((应用程序x)=>(int)1))
,(i分组g)=>新建
{
avgaapplicationtime=(int)Math.Round(g.Average((应用程序i)=>i.ApplicationTime)),
AvgDecisionTime=(int)数学四舍五入(g.平均值((应用程序i)=>i.决策时间)),
批准率=100.0*g.Count((应用程序i)=>i.IsAccepted)/g.Count()
}));
返回新的应用程序状态((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()
var q1=r.Find(x=>x.CreatedOn=endDate);
var q2=q1.选择(x=>x.申请人);
var q3=q2.GroupBy(x=>1,(g)=>newapplicationstats(1,1,0.75));//为了简洁起见,我省略了一些内容
//q4=???//需要返回单个Applicationstats()
不幸的是,尽管使用了.Select(),.SelectMany(),.First()的组合,但我还没有找到谜题的最后一块


我知道答案很简单,但我们非常感谢您的帮助。

新查询存在许多问题

bommelding是正确的-拼图的最后一位是
q4=q3.First()

但是,如果不对本声明进行其他更改,则此操作将不起作用:

var q3 = q2.GroupBy(x => 1, (key, g) => new
                {
                    AvgFormCompletionTime = 360,
                    AvgProcessingTime = 90,
                    ApprovalRate = .75
                });
首先添加了“键”,使(g),(键,g)

其次,linq只接受无参数构造函数,而我的问题中没有

为了转换最终的匿名属性,我在末尾添加了以下语句:

return new ApplicationStats(q4.AvgFormCompletionTime, q4.AvgProcessingTime, q4.ApprovalRate);

我投票结束这个问题,因为代码正在运行,但OP希望改进它。因此,这个问题更适合于