Как RowFilter столбец с точкой в ​​имени?

У меня есть DataTable, созданный из куба с именами столбцов, объявленными как:

[Меры].[Количество на складе]

Однако DataTable заполняется правильно при попытке применить RowFilter с использованием:

"[Меры].[Кол-во на складе] >= 2000"

Я получаю следующую ошибку:

"[Measures.StockQty] не найден

Я также пытался использовать только имя столбца:

"[Запас Кол-во] >= 2000"

но это также терпит неудачу с не найденной ошибкой.

Можно ли вообще фильтровать DataTable, используя имена столбцов, содержащих точки, и если да, то как?


person BinaryMisfit    schedule 19.12.2012    source источник
comment
Если у вас есть только одна таблица в вашем запросе, вы можете просто использовать имя столбца.   -  person Neil Knight    schedule 19.12.2012
comment
@NeilKnight Пробовал. Не идти.   -  person BinaryMisfit    schedule 19.12.2012
comment
Каково настоящее имя столбца в DataTable? Используйте отладчик, чтобы проверить его.   -  person Tim Schmelter    schedule 19.12.2012
comment
@TimSchmelter Интересно, судя по отладке столбца: [Measures].[UnitsSold]   -  person BinaryMisfit    schedule 19.12.2012
comment
@NeilKnight Удаление скобок не помогло ни в одном из сценариев :(   -  person BinaryMisfit    schedule 19.12.2012
comment
Что, если вы используете эту конструкцию: "[[Measures].[UnitsSold]]"?   -  person Tim Schmelter    schedule 19.12.2012
comment
@TimSchmelter Стоит попробовать, но не стоит. Думаю, мне нужно пересмотреть всю эту идею сверху вниз.   -  person BinaryMisfit    schedule 19.12.2012


Ответы (2)


Вы можете переименовать столбцы с данными (для замены периода на «_»), и они попробуют фильтр строк.

Eg.:

dataTable.Columns["Stock Qty"].ColumnName = 
                 dataTable.Columns["Stock Qty"].ColumnName.Replace(" ", "_");
person Kapil Khandelwal    schedule 19.12.2012
comment
Требует дополнительного обслуживания, которого следует избегать. Это обходной путь. - person BinaryMisfit; 19.12.2012

Почему вы вообще хотите использовать RowFilter? Если вы используете .NET 3.5 или выше, я бы рекомендовал вместо этого использовать Linq-To-DataTable, который является более мощным и читабельным:

IEnumerable<DataRow> filteredRows = tblMeasures.AsEnumerable()
    .Where(r => r.Field<int>("Stock Qty") >= 2000);

если вам снова нужен DataTable:

DataTable tblFiltered = filteredRows.CopyToDataTable();

Кстати, если имя столбца в DataTable равно "Stock Qty", ваш последний подход должен работать, так как вам нужно заключить его в скобки.

tblMeasures.DefaultView.RowFilter = "[Stock Qty] >= 2000";

Поэтому вам следует использовать отладчик, чтобы увидеть настоящее имя и тип столбца.

person Tim Schmelter    schedule 19.12.2012
comment
Я согласен, что это лучшее решение, однако нам не разрешено использовать LINQ (пожалуйста, не спрашивайте почему). Я пытаюсь найти быстрое и грязное решение, но это стоит того, чтобы использовать его в будущем. - person BinaryMisfit; 19.12.2012