【问题标题】:How to round nullable decimal value when using System.Linq.Dynamic使用 System.Linq.Dynamic 时如何舍入可为空的十进制值
【发布时间】:2012-02-02 18:49:33
【问题描述】:

当我尝试使用 Math.Round(x,0) 或 Math.Round(x) 时,我收到错误 System.Linq.Dynamic.ParseException: No applicable method 'Round' exists in type 'Math'

当我尝试使用 Convert.ToInt64(x) 时出现异常 Expression of type 'System.Nullable`1[System.Decimal]' cannot be used for parameter of type 'System.Object' of method 'Int64 ToInt64(System.Object)'

当我尝试使用 (long)x 时,出现异常 No property or field 'long' exists in type 'DynamicClass1'

【问题讨论】:

  • 我们能看到引发这些错误的代码吗?
  • 你能不能自己制作方法并检查十进制可空的 ABS
  • 给出异常的代码行如下所示:query.GroupBy("new(x as FieldName)","it")。我想按此字段分组,但按浮点值分组会给出太多组值,所以我想通过四舍五入来减少组数: query.GroupBy("new(Math.Round(x) as FieldName)" “它”)。

标签: c# linq math dynamic dynamic-linq


【解决方案1】:

您是否使用 linq 语句来执行 Math.Round(x,0); ? 如果不是,听起来您将不得不做 System.Math.Round(x,0); aslo 是 x 声明为双精度或小数..?需要看看你的代码实际上是什么样子的..

【讨论】:

    【解决方案2】:

    您的问题是 Math.Round 需要 decimal 而不是(可为空的)decimal?

    你可以这样做:

    decimal?[] values = { 0.1M, 0.123M, 0.456M, 0.345M, null, 0.2M, 0.01M, null, 0.367M };
    
    var grouped = values.GroupBy(x => x.HasValue ? (decimal?)Math.Round(x.Value, 1) : null);
    
    foreach (var group in grouped)
    {
        Console.WriteLine("Group {0} has these members:", group.Key == null ? "Null" : group.Key.ToString());
        foreach (var groupMember in group)
        {
            Console.WriteLine("> {0}", groupMember == null ? "Null" : groupMember.ToString());
        }
    }
    

    这会保留null 的值,将它们映射到具有键null 的组。如果你不关心这些,你可以这样做:

    var grouped = values.Where(x => x.HasValue).Select(x => x.Value).GroupBy(x => Math.Round(x, 1));
    

    这样所有内容都将不可为空decimal

    【讨论】:

    • 正如我所提到的,转换为 (long) 会导致解析异常,因此转换为任何其他类型,包括 (double?)。我已经考虑过这种方法,但动态 linq 解析器不允许这样做。动态 linq 解析器与 Linq 完全不同,例如对于条件表达式,它需要 iif(expr,val1,val2) 而不是 C# ?操作员。基本上,我不知道如何在 Dynamic Linq 中投射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多