【问题标题】:Convert string to int for sum in linq将字符串转换为int以在linq中求和
【发布时间】:2013-12-04 12:30:01
【问题描述】:

我有一个专栏requestAmount,即nvarchar(100)

我需要计算总和:

int? sum = q.Sum(g => g.requestAmount);

我收到了这个错误:

错误 26 无法将 lambda 表达式转换为委托类型 'System.Func<samtaApplication.DbLayer.tblMaterial,int>' 因为有些 块中的返回类型不能隐式转换为 委托返回类型

如何将字符串转换为 int?

【问题讨论】:

  • 很高兴知道 requestAmount 是 nvarchar(100),但是当您处于 c# 对象世界中时,您可以说它是一个字符串;)
  • Enumerable.Sum 永远不会返回 null。所以你确定你需要Nullable<int> 吗?

标签: c# linq


【解决方案1】:

linq to entity中,您始终可以先实现查询,因此您将对 linq to objects 进行操作

int? sum = q.AsEnumerable().Sum(g => Int.Parse(g.requestAmount));

请注意,它将从 db 加载整个 q

编辑:

如果requestAmount 可以为空,则使用:

int? sum = q.AsEnumerable().Sum(g => Convert.ToInt32(g.requestAmount));

Convert.ToInt32 将在 null 作为参数传递时返回 0

【讨论】:

  • 嗯,如果 requestAmount 为空?
  • @RaphaëlAlthaus 没有关于此字段可空性的信息。如果它是可空的 nvarchar 那么我们需要使用 Convert.ToInt32
  • 好吧,对于您的第二个版本,总和永远不会为空,那么为什么要使用 Nullable<int>。关于这一点的问题不清楚,你是对的。
  • 无论如何,Enumerable.Sum 永远不会返回 null...所以第二个版本完全有效...
  • @RaphaëlAlthaus 是的,返回 null 的唯一方法是制作一些 if 语句并检查所有值是否为 null -> return null / else 计算非 null 值的总和
【解决方案2】:
int? sum = q.Sum(g => Int32.Parse(g.requestAmount));

【讨论】:

    【解决方案3】:

    string 可以为 null 或为空,因此,请使用带有 Where 的过滤器并在应用 Sum 之后对其进行安全处理,例如:

    int dummy;
    int result = q.Where(g => int.TryParse(g.TryParse(g.requestAmount, out dummy))
                  .Sum(g => int.Parse(g.requestAmount.Trim()));
    

    【讨论】:

      【解决方案4】:

      您是否尝试过使用 int.TryParse?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 2013-02-28
        • 2011-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        相关资源
        最近更新 更多