我试图让总跑步.
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 =>如何解决这个问题?
您正在对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)将在本地执行.