Lambda Expression与语句体无法转换

时间:2015-04-02 10:53:11

标签: c# linq

我正试图让总跑步。

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 =>我该如何解决这个问题?

2 个答案:

答案 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;之后使用简单表达式操作