c# - 先前工作代码中带有语句体错误的 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 列。我删除了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();
我喜欢使用只需要 keySelector(没有元素选择器)的 GroupBy 的重载。这样,LINQ 管道在我看来变得更具可读性,因为每个函数都有一个任务。
希望对你有帮助
推荐阅读
- php - NFC 标签打开的链接无法在 Android Chrome 上重定向
- javascript - 访问对象数组中信息的最佳实践。[.find() vs. .filter() vs. 创建引用对象]
- python - 查找大熊猫数据框的列发生变化的索引
- apache-kafka - kafka流+如何使状态存储中的条目异步过期
- android - 使用 AndroidX 的应用无法缩放文本
- python-3.x - Python陷入无限的While循环?
- assembly - 寄存器 a1 的地址超出范围错误
- c# - 将 .NET Core 2.2 迁移到 .NET Core 3.1 并继续引用 EF Core 2
- android - 颤振闪屏,里面有逻辑
- api - 尝试对 SSE 类型内容类型进行断言