首页 > 解决方案 > 先前工作代码中带有语句体错误的 Lambda 表达式

问题描述

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

这里

代码如下:

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 列。我删除了tabStockPlannernew {,它是坚固的。所以将其标记为正确。有异议吗?它运作良好。

这是修改后的代码

  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();

标签: c#asp.netlinq

解决方案


修正:您正在使用的 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 管道在我看来变得更具可读性,因为每个函数都有一个任务。

希望对你有帮助


推荐阅读