【问题标题】:Linq Input string was not in a correct format in MVCLinq 输入字符串在 MVC 中的格式不正确
【发布时间】:2018-04-19 11:57:10
【问题描述】:

老程序员编码的原始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 论坛,但错误仍然存​​在。

问题是我在这里做错了什么?为什么我的前两个代码有效,但没有?最后,为什么会出现 'Input string was not in a correct format' 错误?

提前致谢。

更新

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();

【问题讨论】:

  • 金额的类型是什么
  • 你能在这里复制你的整个 linq 查询吗 - g 代表什么?而且,可以尝试 double.Parse() 或 decimal.Parse()
  • amount 的其中一个值不是Convert.ToDouble() 解析的有效格式。到目前为止,您给出的示例都很好。检查其余数据。我确实担心amount 在原始查询中被转换为money。为什么它被存储为money
  • @TheGeneral 数据类型是字符串
  • @Yatin 更新了我的帖子。包括我的整个 Linq 代码

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


【解决方案1】:

首先

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

其次

如果您稍微担心准确性,请不要使用 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 在 cmets 中所述,您不能在 EF 或 Linq to sql 中使用 parse 方法,这必须在内存中完成,我会考虑在铺设数据类型和/或查询下更改您

【讨论】:

  • EF 是否支持decimal.Parse?在最坏的情况下,你需要在内存中这样做
  • 当我第一次看到老程序员在数据库中构建的代码和数据类型时,我也有同样的想法。我想我真的应该改变数据库。感谢您的回答和链接。荣誉
猜你喜欢
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多