将旧系统存储过程转LINQ时遇LINQ to Entities Convert.ToDouble报错求助
解决LINQ to Entities无法识别
Convert.ToDouble的问题 嘿,这个问题我之前也碰到过,其实原因很好理解:LINQ to Entities会把你写的查询表达式翻译成数据库能执行的SQL语句,但Convert.ToDouble()是.NET专属的方法,Entity Framework没办法把它转换成对应的SQL操作,所以就抛出了这个错误。
给你几个可行的解决方案,你可以根据自己的场景选择:
1. 最推荐:从根源修正数据类型
先吐槽一句:把金额存在字符串字段里真的不是个好设计😅,不仅容易出转换问题,还会影响查询性能和数值精度。如果能修改数据库和模型,建议直接把amount字段的类型改成decimal(金额用decimal比double更靠谱,完全不会有精度丢失),模型里对应的属性也改成decimal类型。这样你根本就不需要转换,直接求和就行:
var ObligationRequestDetailsTotalCostByOoe = (from p in db.iBudget_ObligationRequestDetails where p.ooe_general_id != null && p.is_approved == 1 group p by p.ooe_general_id into g select new { id = g.Key, amount = g.Sum(p => p.amount) }) .ToList();
2. 先加载数据到内存再转换(适合小数据量场景)
如果没法修改数据库和模型,可以先把符合条件的数据加载到内存里,再用LINQ to Objects处理(这时候就可以自由使用Convert.ToDouble这类.NET方法了)。不过要注意:如果数据量很大,这种方法会占用较多内存,影响系统性能。
var ObligationRequestDetailsTotalCostByOoe = (from p in db.iBudget_ObligationRequestDetails where p.ooe_general_id != null && p.is_approved == 1 select p) .AsEnumerable() // 关键步骤:把数据从数据库加载到本地内存 .GroupBy(p => p.ooe_general_id) .Select(g => new { id = g.Key, amount = g.Sum(p => Convert.ToDouble(p.amount)) }) .ToList();
3. 使用EF支持的数据库转换函数(EF Core专属)
如果你用的是Entity Framework Core,可以直接用EF提供的EF.Functions.ToDouble()方法,这个方法会被自动转换成SQL的CONVERT函数,能在数据库端完成转换操作:
var ObligationRequestDetailsTotalCostByOoe = (from p in db.iBudget_ObligationRequestDetails where p.ooe_general_id != null && p.is_approved == 1 group p by p.ooe_general_id into g select new { id = g.Key, amount = g.Sum(p => EF.Functions.ToDouble(p.amount)) }) .ToList();
额外提醒:如果是处理金额,更推荐用EF.Functions.ToDecimal(),彻底避免double类型的精度丢失问题。
内容的提问来源于stack exchange,提问作者John Clarence Castro
相关产品推荐
相关产品推荐

