没有分组的实体框架总和和平均值

Posted

技术标签:

【中文标题】没有分组的实体框架总和和平均值【英文标题】:entity framework sum and average without grouping 【发布时间】:2014-05-18 14:42:14 【问题描述】:

实体框架中有没有办法得到下面的简单查询

SQL 查询

select avg(totalsalary), avg(totalhours) from context.employeedetails where company = 1234

在实体框架中,我们像这样进行分组

employeedetails.Where(c => c.company = 1234).GroupBy(c => c.company).Select(x => new 
            
                avgsalary = x.Average(c => c.totalsalary),
                 = x.Average(c => c.totalhours)
            )

有没有正确的方法来重写上面的查询,这样我们就可以避免不必要的分组了

【问题讨论】:

【参考方案1】:

使用组有问题吗? (顺便说一句,您可以使用 GroupBy(c => c)),因为您已经使用了 Where 子句进行过滤。

也就是说,它不能(据我所知)用 LINQ 编写(不生成两个查询而不是一个)。如果您对两个查询感到满意,那么您自然可以执行以下操作:

var query = context.MyTable.Where(x => x.MyVal == 1);

var querySelect = new

    aveValue1 = query.Average(x => x.Property1),
    aveValue2 = query.Average(x => x.Property2)
;

...但正如您所料,它的执行速度较慢。

因此,我建议您使用已有的查询,尽管稍微更改 GroupBy OR 或者通过将其编写为存储过程并将该 SP 映射到您的上下文,您可以获得更好的性能只能说:

var query = myContext.MyStoredProcedure(companyId);

(例如)!希望对您有所帮助。

【讨论】:

是的,使用组时存在问题,因为生成的 SQL 不同。我使用 LinqPAD 对其进行了测试,在 DB 服务器上它产生了低效的 SQL @user275157 嗯,我会留意的 - 感谢您的提醒!【参考方案2】:

尝试研究使用商店功能,例如这些。这些是特殊的存根函数,可在运行时转换为内置存储函数。

http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions%28v=vs.110%29.aspx

【讨论】:

以上是关于没有分组的实体框架总和和平均值的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 0813. 最大平均值和的分组

LeetCode 0813. 最大平均值和的分组

813. 最大平均值和的分组(Python)

MySQL 聚合函数 和 分组查询(初级)

MySQL 聚合函数 和 分组查询(初级)

MySQL 聚合函数 和 分组查询(初级)