LINQ查询调用某些方法进行其他计算

时间:2011-11-29 03:38:13

标签: c# asp.net linq lambda

我有一个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 };

2 个答案:

答案 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的值。