【问题标题】:LINQ query that calls some method for additional calculations调用某些方法进行额外计算的 LINQ 查询
【发布时间】:2011-11-29 03:38:13
【问题描述】:

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

【问题讨论】:

  • 除非您进行聚合(求和、分组...),否则请使用 linq-to-sql 查询数据库,并且当您手头有数据时,请使用 linq-to-objects您的业​​务层来处理您的对象。

标签: c# asp.net linq lambda


【解决方案1】:

您应该做 DB 可以在 DB 中做的部分,然后使用 .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)});

【讨论】:

  • 感谢您的建议。 Gabe 您上面的代码解决了一个问题并创建了另一个问题,我需要为此做一些其他工作。还有很多东西要学!
【解决方案2】:

您的 linq 是正确的,但 .ToList() 之前的 linq 查询的一部分正在被 EF 转换为 SQL,并且它不知道如何将 calcRate 转换为 SQL,您必须在获取所有内容后执行 calcRate来自 sql 的值。

【讨论】:

    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多