3

这是我要评估的表达式:

Sum(IIF(QUALITY<=9.0,1.0,0.0))

问题是

string expr = "Sum(IIF(QUALITY<=9.0,1.0,0.0))";
dataTable.Compute(expr, "")

抛出一个错误说

Syntax error in aggregate argument: Expecting a single column argument with possible 'Child' qualifier.


主要的挑战是我不能手动重写表达式,因为它是从 RDL 文件中以字符串形式出现在我的程序中的,所以它最初看起来像

Sum(IIF(Fields!QUALITY.Value<=9.0,1.0,0.0))

并且我的程序需要自动将其转换为一个字符串,该字符串在传递给dataTable.Compute(). 我从 Microsoft 的 Compute 方法文档中确定 C# 不喜欢“字段!” 或语法的“.Value”部分,通过删除它们,我可以使更简单的表达式正常工作;例如,这些语句都返回预期值:

dataTable.Compute("Sum(QUALITY)");
dataTable.Compute("Count(QUALITY)");


有可能做我想做的事吗?我觉得我应该只需要在某个地方稍微改变一下语法就可以了,但我无法在互联网上找到答案,这让我非常沮丧。

以下是我迄今为止尝试过的一些事情,但无济于事:

Sum(IIF([QUALITY]<=9.0,1.0,0.0))
Sum(Convert(IIF(QUALITY<=9.0,1.0,0.0), 'System.Double'))
Sum(IIF(Convert(QUALITY, 'System.Double')<=9.0,1.0,0.0))    
4

2 回答 2

5

执行此操作的一种方法可能是将聚合列添加到DataTableExpression 设置为IIF(QUALITY<=9.0,1.0,0.0)

dataTable.Columns.Add("AggregateColumn", typeof(double), "IIF(QUALITY<=9.0,1.0,0.0)");

然后对聚合列求和或计数。

于 2012-07-05T20:49:48.367 回答
2

IIF(condition, value1, value2)value1如果为真则返回conditionvalue2否则返回。因此,您的原始语句计算Quality值 <= 9 的所有字段的数量。您可以使用包含filter参数的重载来实现此目的。

dataTable.Compute("Count(QUALITY)","QUALITY <= 9");

MSDN 文档

编辑:错过了第一轮的动态要求。

发生错误是因为 IIF 将其设为两列操作,并且Compute不允许在聚合函数中进行两列操作。意思Compute("IIF(Quality <= 9, 1, 0)")是有效的,但Compute("Sum(IIF(Quality <= 9, 1, 0))")不是。您可以使用IIF(Quality <= 9, Quality, SomeOtherColumn)而不是文字作为 的后两个参数IIF,并且解析器似乎不知道其中的区别。

您可以使用 Joe 的解决方案,或添加更多字符串处理以分离出条件句并将它们移至过滤器参数。Joe 的回答比试图重新实现在Compute.

于 2012-07-05T20:39:46.047 回答