在 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)
我有一个简单的看法:
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)