Вы отметили Linq но вы используете DataTable.Select
, который является старым методом фильтрации DataTable
. Используйте Enumerable.Where
и фордилин, набрав Field
метод расширения.
decimal priceFrom = decimal.Parse(HiddenField1.Value);
decimal priceTo = decimal.Parse(HiddenField2.Value);
var dtFiltered = dtt.AsEnumerable()
.Where(row => row.Field<decimal>("Price") >= priceFrom
&& row.Field<decimal>("Price") <= priceTo))
.CopyToDataTable();
Предположив, что тип столбца decimal
, если это другой тип вам нужно использовать, что в Field
или преобразовать его в первую очередь.
Обратите внимание, что вам необходимо добавить System.Linq
(файл) и ссылку на System.Data.DataSetExtensions
(проект).
Update
но показывает ошибку, когда значения не найдены в DataTable
CopyToDataTable
генерирует исключение, если входная последовательность пуста. На мой взгляд, лучший подход заключается в том, чтобы обрабатывать этот случай отдельно:
DataTable tblFiltered = dtt.Clone(); // clones only structure not data
var filteredRows = dtt.AsEnumerable()
.Where(row => row.Field<decimal>("Price") >= priceFrom
&& row.Field<decimal>("Price") <= priceTo));
if(filteredRows.Any())
{
tblFiltered = filteredRows.CopyToDataTable();
}
Какая ошибка вы получаете? Похоже, что метод 'CopyToDataTable()' extension должен возвращать пустую 'DataTable', даже если результат был пуст, а не ошибка. – Ocelot20