我正试图让总跑步。
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 =>
我该如何解决这个问题?
答案 0 :(得分:7)
您正在对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
)将在本地执行。
答案 1 :(得分:-1)
错误:带有语句正文的Lambda表达式无法转换为表达式树
这意味着你不能将lambda表达式用于&#34;语句体&#34;这是linq2sql的情况。这意味着您只能在=&gt;之后使用简单表达式操作