c#DataGrid BindingListCollectionView自定义过滤器抛出聚合函数均值的无效用法

问题描述 投票:1回答:1

我有一个集合视图,在该视图中,我想应用大于平均值的过滤条件。问题是列类型是字符串。因此,转换为双精度类型后,正常值大于任何数字的效果都很好,问题是如何进行平均计算。我尝试了以下代码:

collectionView.CustomFilter = $"CONVERT({col}, 'System.Double') > AVG([{col}])";

正如预期的那样,由于无法将AVG应用于字符串类型,因此会中断。但是当我试图把

AVG([CONVERT({col}, 'System.Double')])

它不评估转化。

是否有克服的建议?

c# wpf datatable collectionviewsource bindinglist
1个回答
0
投票

实际上是支持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})";
© www.soinside.com 2019 - 2024. All rights reserved.