我需要这方面的帮助,我有一段非常重要的代码,我从这个线程中得到了帮助
这里
代码如下:
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();