【问题标题】: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)
            })

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

【问题讨论】:

    标签: c# entity-framework entity-framework-5 entity-framework-4.1


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2021-02-27
      • 2018-11-29
      • 1970-01-01
      • 2015-10-09
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多