繁体   English   中英

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

[英]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#的某些限制,只有不带{ ... } 编写的表达式(以及其他限制...不, ifreturn ,...)可以转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM