Linq输入字符串在MVC中的格式不正确

时间:2018-04-19 03:23:42

标签: c# linq sql-to-linq-conversion

旧程序员编写的原始SQL命令如下所示

SELECT ooe_general_id, SUM(CAST(CAST(amount AS money) AS float)) AS totalAppro, MAX(date) AS lastDate 
FROM  dbo.pmTA_OoeGeneralAppropriation

数据类型:字符串

Database Values
----------------
3,200,000.00
2916410
28,710,000.00
0.80000000000291
-1000000

当我尝试将上述代码转换为Linq时,错误'输入字符串格式不正确'显示在此行中

totalAppro = g.Sum(p => Convert.ToDouble(p.amount))

我尝试将代码更改为

Convert.Double(string, IFormatprovider)  
Convert.ToDouble(String.Format("{0:c}", p.amount)) 
Convert.ToDecimal(p.amount.Replace(",",""))

来自这些CurrencyConvertSUM LINQ论坛,但错误仍然存​​在。

问题是我在这里做错了什么?为什么我的前两个代码有效,但事实并非如此?最后,为什么'输入字符串格式错误'错误?

提前致谢。

更新

var totalAppropriationGeneralFund = (from p in db.iBudget_OoeGeneralAppropriation   
                                 where !p.amount.StartsWith("-")
                                 group p by p.ooe_general_id into g    
                                 select g).AsEnumerable().Select(g => new {
                                 id = g.Key,
                                 totalAppro = g.Sum(p => Convert.ToDecimal(p.amount.Replace(",",""))),
                                 date = g.Max(p => p.date)
                             }).ToList();

1 个答案:

答案 0 :(得分:2)

<强>首先

不要将数据类型存储或转换为字符串并将其转换回来。将它们保留为原样,将它们转换为仅用于显示目的,并且绝对不会将数字类型作为字符串存储在数据库中(只是提示)。

<强>其次

如果您稍微担心准确性,请不要使用doublefloat等浮点值。他们因丢失精确度和添加人工制品而臭名昭着,使用decimal

第三

  

NumberStyles Enumeration :确定数字字符串参数中允许的样式   传递给Parse和TryParse方法的积分和   浮点数字类型。

以上是你的问题

工作示例

var list = new List<string>
   {
      "3,200,000.00",
      "2916410",
      "28,710,000.00",
      "0.80000000000291",
      "-1000000"
   };

var sum = list.Sum(x => decimal.Parse(x, NumberStyles.Any, CultureInfo.InvariantCulture));

<强>输出

33826410.80000000000291

Full Demo here

进一步阅读

decimal (C# Reference)

<强>更新

Bagus Tesa 的评论中所述,您无法在EF或 Linq中使用parse方法来使用sql ,这必须在内存中完成,我会考虑在铺设数据类型和/或查询

下更改您