2012-01-04 15 views
0

當我嘗試使用Math.Round(x,0)或Math.Round(x)時,出現錯誤System.Linq.Dynamic.ParseException: No applicable method 'Round' exists in type 'Math'如何在使用System.Linq.Dynamic時舍入可爲空的十進制值

當我嘗試使用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'

+1

我們可以看到引發這些錯誤的代碼嗎? – 2012-01-04 21:23:02

+0

你可以做你自己的方法,檢查十進制爲空的ABS – MethodMan 2012-01-04 21:24:55

+0

提供異常的代碼行如下所示:query.GroupBy(「new(x as FieldName)」,「it」)。我想按這個字段進行分組,但是通過浮點值分組給出了太多的組值,所以我想通過舍入它來減少組的數量:query.GroupBy(「new(Math.Round(x)as FieldName)」 ,「它」)。 – alpav 2012-01-04 22:22:27

回答

0

你使用linq語句來做Math.Round(x,0); ? 如果沒有,它聽起來像你必須做System.Math.Round(x,0); aslo is x declare as a double or a decimal ..?將需要看看你的代碼實際上看起來像請..

1

您的問題是,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

+0

正如我所提到的,鑄造到(長)造成解析異常,所以鑄造到任何其他類型,包括(雙?)。我已經考慮過這種方法,但動態linq解析器不允許這樣做。動態linq解析器與Linq完全不同,例如對於條件表達式,它需要iif(expr,val1,val2)而不是C#?運營商。基本上,我不知道如何投射Dynamic Linq。 – alpav 2012-01-05 16:33:31