以下行为是不同的,并且难以管理,具体取决于是否执行查询:
using (var db = new DbContext())
{
db.Entities.Select(x => Math.Round(0.5)).First(); // return 1
db.Entities.ToList().Select(x => Math.Round(0.5)).First(); // returns 0
db.Entities.AsEnumerable().Select(x => Math.Round(0.5)).First(); // returns 0
}
当然,我的实际代码在x
上执行了一个操作。这是为了简单起见。
我知道有Math.Round with MidpointRounding,但是Linq to Entities不支持它:
LINQ to Entities无法识别方法'Double Round(Double, System.MidpointRounding)方法,并且该方法无法翻译 进入商店表达式。
我的问题是,除了执行查询和在内存中舍入外,还有没有办法在c#和Linq to Entities中具有相同的行为?
是否可以将Math.Round的默认行为设置为始终使用MidpointRounding.AwayFromZero
?
答案 0 :(得分:0)
基于对this question的回答,看来您所要求的是不可能的。该问题的答案还建议您使用AsEnumerable来获取数据,就像对该问题的其他评论一样,并使用本地查询对内存中的数据进行四舍五入。
var rawData = db.Entities.Select(x => 0.5);
var rounded = rawData.AsEnumerable().Select(x => Math.Round(x, MidpointRounding.AwayFromZero));