Tho*_*ker 3 c# wpf datatable bindinglist collectionviewsource
我有一个集合视图,我想在其中应用大于平均水平的过滤器。问题是列类型是字符串。因此,正常大于任何数字在转换为双精度类型后都可以完美工作,问题是如何求平均值。我尝试了以下代码:
collectionView.CustomFilter = $"CONVERT({col}, 'System.Double') > AVG([{col}])";
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它会中断,因为 AVG 无法应用于字符串类型。但是当我试图把
AVG([CONVERT({col}, 'System.Double')])
Run Code Online (Sandbox Code Playgroud)
它不评估转化。
有什么建议可以克服它吗?
DataView.RowFilter这实际上是底层(和DataColumn.Expression)支持的聚合的限制:
聚合只能应用于单个列,聚合内部不能使用其他表达式。
我认为克服它的唯一方法是将(动态)计算列添加到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})";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
378 次 |
| 最近记录: |