我正在尝试获得运行总数。
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上执行add-to-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就是这样。这意味着您只能在=>运算符