在以前工作的代码中具有语句正文错误的 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解决方案运行良好,以及@NetMageAsEnumerable()的建议 我正在发布 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();

修正:您使用的 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();

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

希望对您有所帮助

替换为

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

最新更新