gpt4 book ai didi

c# - 带有语句体的 Lambda 表达式无法转换

转载 作者:太空宇宙 更新时间:2023-11-03 19:05:04 27 4
gpt4 key购买 nike

我正在尝试计算总计。

decimal currentTotal = 0;
var query = test
.OrderBy(i => i.Date)
.Select(i =>
{
currentTotal += i.Amount;
return new
{
Date = i.Date,
Amount = i.Amount,
RunningTotal = currentTotal
};
}
);

我在这行 .Select(i => 我怎么解决这个问题?

最佳答案

您正在对 Entity Framework 或 LINQ2SQL 进行查询:

decimal currentTotal = 0;

var query = test
.OrderBy(i => i.Date)
.Select(i => new
{
Date = i.Date,
Amount = i.Amount
})

// Above lines executed on SQL
.AsEnumerable()
// Below lines executed locally

.Select(i =>
{
currentTotal += i.Amount;
return new
{
Date = i.Date,
Amount = i.Amount,
RunningTotal = currentTotal
};
}
);

您无法在 SQL Server 上执行对 currentTotal 的添加,因此您使用 AsEnumerable()在本地执行。

解释:

当您使用 EF/LINQ2SQL 编程时,您使用 IQueryable<T> 构建的查询被翻译成 SQL 语言并在 SQL Server 上执行。所以 .OrderBy()变成 ORDER BY , 所有 .Where()成为WHERE等等。显然,如果在 LINQ 查询中放置了一些无法转换为 SQL 的内容,那么在转换查询时会出现异常。现在,您的查询中有两个问题。

对于C#的一些限制,只有不写{ ... }的表达式blocks (以及其他一些限制......没有 if ,没有 return ,......)可以翻译成 Expression<Func<>> .因此,您的程序无法编译。

即使可以直接编译它,SQL Server 也不知道您的 currentTotal变量,所以你会得到一个 NotSupportedException在运行时。

解决方案:您创建一个“合法”查询,其中仅包含可由 SQL 执行的部分...您 .Select()您需要的列。然后用 .AsEnumerable()你告诉 EF 来自 .AsEnumerable()以后它不能将查询转换为 SQL,并且必须“在本地”执行查询。所以 .OrderBy()第一个.Select()将在 SQL 端执行,而第二个 .Select() (带有 currentTotal )将在本地执行。

关于c# - 带有语句体的 Lambda 表达式无法转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29411145/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com