如何在使用 System.Linq.Dynamic 时舍入可为空的十进制值

本文关键字:舍入 十进制 Dynamic Linq System | 更新日期: 2023-09-27 18:19:23

当我尝试使用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'.

如何在使用 System.Linq.Dynamic 时舍入可为空的十进制值

您的问题是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.

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