如何在使用 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'
.
您的问题是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 声明为双精度还是小数..?需要看看你的代码实际上是什么样子的。.