![](/img/trans.png)
[英]A lambda expression with a statement body cannot be converted to an expression tree(Lambda and Linq)
[英]Lambda Expression with a statement body can not been converted
我正在努力使总数。
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 =>
我该如何解决呢?
您正在查询实体框架或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#的某些限制,只有不带{ ... }
块编写的表达式(以及其他限制...不, if
不return
,...)可以转换为Expression<Func<>>
。 因此,您的程序无法编译。
即使可以直接编译它,SQL Server也不知道currentTotal
变量的任何内容,因此您将在运行时得到NotSupportedException
。
解决方案:您仅使用SQL可以执行的部分创建一个“合法”查询... .Select()
您将需要的列。 然后,使用.AsEnumerable()
告诉EF,从.AsEnumerable()
开始,它不得将查询转换为SQL,并且必须“本地”执行查询。 因此, .OrderBy()
和第一个.Select()
将在SQL端执行,而第二个.Select()
(带有currentTotal
)将在本地执行。
错误:带有语句主体的Lambda表达式无法转换为表达式树
这意味着您不能将lambda表达式与“语句主体”一起使用,而linq2sql就是这种情况。 这意味着您只能在=>运算符之后使用简单表达式
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.