Lambda Expression与语句体无法转换

Ale*_*kiy 1 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
               };
           }
                  );
Run Code Online (Sandbox Code Playgroud)

我在这行中有错误 .Select(i =>如何解决这个问题?

xan*_*tos 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
                };
            }
        );
Run Code Online (Sandbox Code Playgroud)

您无法在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)将在本地执行.