我有一个集合视图,在该视图中,我想应用大于平均值的过滤条件。问题是列类型是字符串。因此,转换为双精度类型后,正常值大于任何数字的效果都很好,问题是如何进行平均计算。我尝试了以下代码:
collectionView.CustomFilter = $"CONVERT({col}, 'System.Double') > AVG([{col}])";
正如预期的那样,由于无法将AVG应用于字符串类型,因此会中断。但是当我试图把
AVG([CONVERT({col}, 'System.Double')])
它不评估转化。
是否有克服的建议?
实际上是支持DataView.RowFilter
的基础DataColumn.Expression
(和Aggregates)的限制:
聚合只能应用于单个列,并且聚合内不能使用其他表达式。
我看到的克服此问题的唯一方法是将(动态)计算的列添加到预先形成DataTable
的基础CONVERT
中,然后在过滤器表达式中使用该列。
类似这样的东西:
var dataView = collectionView.SourceCollection as DataView;
if (dataView.Table.Columns[col].DataType == typeof(string))
{
var calcCol = col + "_Double";
if (!dataView.Table.Columns.Contains(calcCol))
dataView.Table.Columns.Add(calcCol, typeof(double), $"CONVERT({col}, 'System.Double')");
col = calcCol;
}
collectionView.CustomFilter = $"{col} > AVG({col})";