【问题标题】:Lambda expression with statement body error in previously working code先前工作代码中带有语句体错误的 Lambda 表达式
【发布时间】:2019-12-26 16:32:25
【问题描述】:

我需要这方面的帮助,我有一段非常重要的代码,我从这个线程得到了帮助

Here

代码如下:

var pln = db.tabStockPlanners
            .Where(y => y.ExpectedHarvestDate < addoneyear)
            .Where(r => r.Published == 1)
            .Where(f => f.Available == 1);

var gruppedList = pln.GroupBy(x => x.ItemID, (key, enumerable) =>
        {
            return new tabStockPlanner { ItemID = key, ExpectedYieldInTonnes = enumerable.Sum(k => k.ExpectedYieldInTonnes) };
        }).OrderByDescending(t => t.ExpectedYieldInTonnes).ToList();

但我得到一个错误

带有语句体的 lambda 表达式不能转换为表达式树

我不知道这是否与 EF 有所不同。有人可以帮我弄这个吗? EF 是版本 6。当前代码有问题吗?

更新

完美的做法是:

 var gplist = from x in db.tabStockPlanners
                     where x.Published == 1
                     where x.Available == 1
                     where x.ExpectedHarvestDate < addoneyear
                     group x.ExpectedYieldInTonnes by new { x.ItemID }
                     into g
                     select new { g.Key.ItemID, ExpectedYieldInTonnes = g.Sum() };

但我也想按照这个语法得到正确的答案。也许有人可以使用 LINQ 语法重新发布。谢谢。

更新 你好朋友; @YosefBinmal 解决方案运行良好,连同@NetMage 对AsEnumerable() 的提议,我发布了 Yosef 的解决方案,并对其进行了修改以使其匿名并仅返回所需的 2 列。我删除了tabStockPlanner,所以它的new { 是实心的。所以将其标记为正确。有异议吗?效果很好。

这是修改后的代码

  var pln = db.tabStockPlanners
          .Where(y => y.ExpectedHarvestDate < addoneyear)
          .Where(r => r.Published == 1)
          .Where(f => f.Available == 1);

        var gruppedList = pln
            .AsEnumerable()
.GroupBy(i => i.ItemID)
.Select(g => new { ItemID = g.Key, ExpectedYieldInTonnes = g.Sum(i => i.ExpectedYieldInTonnes) })
.OrderByDescending(t => t.ExpectedYieldInTonnes)
.ToList();

【问题讨论】:

  • 我想你确实更新了框架?
  • 尝试用新的 { key, enumerable } 替换元组 (key, enumerable)。 EF6 中的元组对我不起作用
  • 这在 EF6 及更早版本中从未受支持。你一定改变了什么。与另一个问题的不同之处在于答案以ToList()结束了第一个查询。
  • @Gleb 是的,我确实更新到了 EF6,以前这有效。

标签: c# asp.net linq


【解决方案1】:

修正:您使用的 GroupBy 扩展方法将表达式 lambda 作为它的第二个参数。您的 lambda 包含无法转换为表达式树的 { return ... } 语句。请参阅CS0834

你可以通过写来避免这个错误:

var gruppedList = pln
    .GroupBy(i => i.ItemID) 
    .Select(g => new tabStockPlanner { ItemID = g.key, ExpectedYieldInTonnes = g.Sum(i => i.ExpectedYieldInTonnes) })
    .OrderByDescending(t => t.ExpectedYieldInTonnes)
    .ToList();

我喜欢使用只需要 keySelector(没有元素选择器)的 GroupBy 的重载。这样,LINQ 管道在我看来变得更具可读性,因为每个函数都有一个任务。

希望对你有帮助

【讨论】:

  • 这并不正确 - 错误意味着无法从 lambda 创建 Expression 树,这与 SQL 转换无关。
  • 非常感谢,很遗憾这不起作用...错误:无法在 LINQ to Entities 查询中构造实体或复杂类型“maxmallModel2.tabStockPlanner”。
  • 这是一个不同的问题。或许this可以帮到你?
  • @NetMage 你说得对,搞混了!修改答案
  • 您可能希望将您的评论重复给@noetico 标记用户,以便他们收到您对他们的评论的通知。这是一个非常好的评论。
【解决方案2】:

替换为

var gruppedList = pln.GroupBy(x => x.ItemID, (key, enumerable) => new tabStockPlanner { ItemID = key, ExpectedYieldInTonnes = enumerable.Sum(k => k.ExpectedYieldInTonnes) })
.OrderByDescending(t => t.ExpectedYieldInTonnes).ToList();

【讨论】:

  • 非常感谢。此代码仍然返回:无法在 LINQ to Entities 查询中构造实体或复杂类型“maxmallModel2.tabStockPlanner”。
  • @noetico 如果您将AsEnumerable 放在GroupBy 之前,那将在该点提取所有数据并在客户端执行GroupBy 等,并且应该可以工作。
  • 好的,所以@NetMage ... Pln.AsEnumerable.GroupBy... 好的,我会试一试。
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2020-01-01
  • 2016-12-19
  • 1970-01-01
相关资源
最近更新 更多