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

时间:2014-04-06 12:32:15

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

实体框架中是否有一种方法可以获得以下简单查询

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)
            })

是否有正确的方法来重写上述查询,以便我们可以通过

避免不必要的分组

2 个答案:

答案 0 :(得分:3)

使用群组是否存在问题? (顺便说一句,这可以只是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);

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

答案 1 :(得分:0)

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

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