【问题标题】:Not able to retrieve sum of varchar column using LINQ in c#无法在 c# 中使用 LINQ 检索 varchar 列的总和
【发布时间】:2020-07-15 18:21:25
【问题描述】:
var a = 123;
var query = (from p in a where p.ID == a) //gives 10 records.
.Sum(Convert.Int32.Parse(x => x.balance); // this line gives the following message.

错误消息。 LINQ to Entities 无法识别方法“Int32 ToInt32 (System.String)”,

varchar 列的数据库设计不能更改为 int 或 double。

【问题讨论】:

  • 您的代码毫无意义。它实际上应该做什么
  • 为什么要以字符串开头的数字值保存?类型的存在是有原因的,使用它们。将适当的类型与预期值匹配。示例:如果您想及时存储某个时刻,您应该使用 Date 类型(.net 中的 DateTime,sql server 中的 DateTime2 等)。如果要存储余额,请使用小数类型。名称可以是 unicode 字符串,代码可以是 ascii 字符串,不胜枚举。
  • 您的意思可能是Convert.ToInt32(...)int.Parse(...)
  • "I am new student. a varchar column contains numeric value ..." ← 不要使用varchar来存储余额,使用像decimal这样的数字类型。然后您可以对存储的值(例如 sum)执行计算。
  • @igor。此时无法更改db的设计。是否可以在linq中使用convert方法并在varchar中对列求和。请分享任何一个工作示例。

标签: c# linq


【解决方案1】:
var a = 123; 
var sum = (from p in a where p.ID == a) //gives 10 records. 
             .Sum(x => int.Parse(x.balance));

var sum = (from p in db.table where p.ID == a)
             .AsEnumerable() // @juharr's suggestion
             .Sum(x => Convert.ToInt32(x.balance));

你想在每次迭代中转换字符串..而不是循环本身

这假设余额是一个字符串而不是一个 int 已经

【讨论】:

  • 是否可以在 linq 中使用 convert 方法并对 varchar 中的列求和。请分享任何一个工作示例。
  • @NadeemTaj 添加了另一个使用Convert.ToInt32() 方法而不是int.Parse() 的示例
  • 它不起作用,并且获取 LINQ to Entities 无法识别方法“Int32 ToInt32 (System.String)”。无论如何感谢您的时间和帮助。我不确定,但感觉当涉及到这三件事(求和,varchar 列上的转换)时,它看起来像是在处理 LINQ 中的错误。
  • @NadeemTaj 这不是错误,EF 必须将代码翻译成 SQL,并且不支持翻译所有内容。一种选择是,如果您在Sum 之前执行AsEnumerable,那么它会将行拉入内存,并且转换将在代码中而不是在数据库中进行。
  • @NadeemTaj 在上面的示例中添加了 juharrs 建议,即在 Sum 之前使用 AsEnumerable
【解决方案2】:

如果实体框架(或 Linq-to-SQL,不确定您使用的是什么 ORM)无法将某些内容转换为 SQL 语法,您可以随时尝试解析查询“C#-side”或客户端。

如果您在.Sum() 之前添加.ToList(),则应强制在数据库上解析查询,然后.Sum(...).ToInt32() 将在内存中执行。

var sum = (from p in db.table where p.ID == a)
             .ToList()
             .Sum(x => Convert.ToInt32(x.balance));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多