c# Пользовательский фильтр DataGrid BindingListCollectionView выбрасывает недопустимое использование среднего значения функции агрегирования. - PullRequest
4 голосов
/ 23 января 2020

У меня есть представление коллекции, в котором я хотел бы применить фильтр больше среднего. Проблема в том, что тип столбца является строкой. Так что нормальное значение больше, чем с любым числом, прекрасно работает после преобразования в тип double, вопрос в том, как это сделать для среднего значения. Я попробовал следующий код:

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

, как и ожидалось, он ломается, поскольку AVG не может быть применен к строковому типу. Но когда я попытался поставить

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

, он не оценивает конверсию.

Есть ли какие-либо предложения по ее преодолению?

1 Ответ

4 голосов
/ 29 января 2020

На самом деле это ограничение поддерживаемых базовых DataView.RowFilterDataColumn.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})";
...