在 Linq 中复制 SQL 结果

Replicate SQL result in Linq

我有一个简单的看法:

CREATE VIEW [dbo].[ApplicationSummary]
AS
    SELECT 
        CONVERT(VARCHAR(50), NEWID()) AS ID,
        ISNULL(AVG(ApplicationTime), 0) AS 'AvgApplicationTime',
        ISNULL(AVG(ResponseTime), 0) AS 'AvgResponseTime',
        ISNULL(CAST(1.0 * COUNT(CASE WHEN [IsAccepted] = 1 THEN 1 END) / COUNT(*) AS float), 0) AS 'PctAccepted'
    FROM 
        [Application]
    WHERE 
        (IsValid = 1) 
        AND (CreatedOn < CAST(GETDATE() AS date) 
        AND CreatedOn >= CAST(GETDATE()-30 AS date))

想法是输出3个变量。前两个是简单的 'averages',而最后一个 'PctAccepted' 输出比率。

我正在测试包含 4 行的 table — 其中 3 行设置为 IsAccepted = true,因此结果为 0.75 (3/4),转换为 75%。

我正在尝试消除对视图的需求并使用 Linq 在我的 Entity Framework class.

上复制它

以下是查询中的重要内容:

var startDate = DateTime.Today;
var endDate = DateTime.Today.AddDays(-30);

var q = r.Find(x => x.IsValid &&
                    x.CreatedOn < startDate && x.CreatedOn >= endDate)
         .GroupBy(x => x)
         .Select(g => new
            {
                AvgApplicationTime = (int)g.Average(i => i.ApplicationTime),
                AvgResponseTime = (int)g.Average(i => i.ResponseTime),
                ApprovalRatio = g.Count(i => i.IsAccepted == true) / (double)g.Count()
            }).First();

return new ApplicationStats(q.AvgApplicationTime, q.AvgResponseTime, q.ApprovalRatio);

到目前为止,我的两个平均值输出正确,但比率返回 1(或 100%)。

最初,我认为这可能是一个舍入问题,但我输出了这一行的结果:g.Count(i => i.IsAccepted == true) 并且它不正确 returns 1.

我可能在错误的地方进行了分组,但目前正在努力使其正常工作。

感谢任何帮助。

找到答案。

已将 .GroupBy(x => x) 更改为 .GroupBy(x => 1)

另外g.Count(i => i.IsAccepted == true)可以简化为g.Count(i => i.IsAccepted)