无法转换具有语句体的Lambda表达式



我正在尝试获得运行总数。

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就是这样。这意味着您只能在=>运算符

之后使用简单表达式

最新更新