无法在Linq查询中将字符串类型转换为十进制数

3

我有一个linq查询,在其中连接3个表,将它们分组到另一个表中,以便可以对第三个表中的值进行求和。

var roles = from p in db.Properties 
                    join od in db.tblOrderDetails on p.pID equals od.odpID 
                    join s in db.tblServices on od.odsID equals s.sID                        
                    where p.poID == 0 && p.pActive == true   

                    group s by new {p.pID, p.pAddress} into g
                    select new
                    {
                        ID = g.Key.pID,
                        Address = g.Key.pAddress,
                        SubTotal = g.Sum(s => s.sPrice)
                    };

我的问题出现在SubtTotal上。我得到了"无法将类型'string'隐式转换为'decimal?'"的错误提示。我尝试使用convert.todecimal,但是我得到了以下错误信息:
LINQ to Entities不识别'System.Decimal ToDecimal(System.String)'方法,而且该方法不能翻译成储存表达式。sqlfunctions.stringconvert也无法解决这个问题。你有什么想法吗?

你尝试过显式转换为十进制吗,例如(decimal)? - David B
你需要将 s.sPrice 显式转换为可空的十进制数,这样 Lambda 才能正确地识别它。 - pnm
4
你的问题是你有一个名为sPrice的字符串类型变量,可能还有另一个名为*Price的数字类型变量。在数据库中仅保存价格的字符串类型是很奇怪的。请注意,这里只是翻译,并没有做出任何解释或添加其他内容。 - xanatos
我认为这是提供程序的限制,因为它将您的查询解析为可以在数据库中评估的表达式,并且Convert.ToDecimal()在数据库表达式中无法识别。 - lintmouse
1个回答

1

我认为如果数据量相对较小,就可以使用LINQ to Entities到LINQ to Objects的转换:

  var roles = (from p in db.Properties 
         join od in db.tblOrderDetails on p.pID equals od.odpID 
         join s in db.tblServices on od.odsID equals s.sID                        
         where p.poID == 0 && p.pActive == true   

         group s by new {p.pID, p.pAddress} into g)
           .AsEnumerable().Select(p => new
                {
                    ID = p.Key.pID,
                    Address = p.Key.pAddress,
                    SubTotal = p.Sum(s => s.sPrice)
                });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接