我有一个linq查询需要对id进行分组以计算2个状态值的行,然后我想调用一个方法来对结果计数执行计算。也许有人可以帮助我理解更好的方法来做到这一点。当我运行这个时,我看到一个例外,linq不能识别'calcRate',但我之前做过类似的事情并且工作正常。我也可能不正确地接近这个:
var query = from c in (context.table
.Where(s => s.date >= startDate && s.date <= endDate)
.GroupBy(s => new { s.id })
.Select(s => new
{
id = h.Key.id,
rate = calcRate(h.Count(s=>s.status == 1), h.Count(s=>s.status != 3))
}).ToList())
select new { id = c.id, rate = c.rate };
答案 0 :(得分:1)
您应该执行数据库可以在数据库中执行的部分,然后使用.AsEnumerable()
将结果返回到.NET以完成计算。
var query = context.table
.Where(s => s.date >= startDate && s.date <= endDate)
.GroupBy(s => s.id)
.Select(s => new
{
id = s.Key,
rateArg1 = s.Count(s=>s.status == 1),
rateArg2 = s.Count(s=>s.status != 3)
})
.AsEnumerable()
.Select(s => new { s.id, rate = calcRate(s.rateArg1, s.rateArg2)});
答案 1 :(得分:0)
你的linq是正确的,但你的linq查询的一部分是。之前.ToList()正在由EF转换为SQL,并且它不知道如何将calcRate转换为SQL,你必须在获取所有之后执行calcRate来自sql的值。