在Linq中复制SQL结果

时间:2018-04-08 08:52:11

标签: sql linq linq-to-entities

我有一个简单的观点:

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个变量。前2个是简单的“平均值”,而最后一个是“PctAccepted”输出比率。

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

我正在尝试删除对视图的需求,并使用Linq在我的Entity Framework类上复制它。

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

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)并错误地返回1.

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

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

找到答案。

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

同样g.Count(i => i.IsAccepted == true)可以简化为g.Count(i => i.IsAccepted)