2013-06-03 6 views
3
DataTable dtt = (DataTable)Session["ByBrand"]; 
var filldt = (dtt.Select("Price >= " + HiddenField1.Value + " and Price <= " + HiddenField2.Value + "")).CopyToDataTable(); 

Этот код работает нормально, когда он нашел значения в выбранном DataTable, но он показывает ошибку, когда значения не найдены в DataTable. Поэтому, пожалуйста, скажите мне, как проверить, нет ли записи.Данные фильтра из DataTable

+0

Какая ошибка вы получаете? Похоже, что метод 'CopyToDataTable()' extension должен возвращать пустую 'DataTable', даже если результат был пуст, а не ошибка. – Ocelot20

ответ

4

Просто проверьте, что ваш выбор возвращает что-либо?

DataTable dtt = (DataTable)Session["ByBrand"]; 
DataRow[] rows = dtt.Select("Price >= " + HiddenField1.Value + " and Price <= " + HiddenField2.Value + ""); 
if(rows.Length > 0) 
{ 
    var filldt = rows.CopyToDataTable(); 
} 

Ну, пример Linq от Тима действительно приятный, но для завершения моего ответа. Метод Select возвращает всегда массив DataRow также, если не выбрана строка, но тогда вы не можете попросить построить данные из этого пустого массива. Думаю об этом. Какую схему CopyToDataTable следует построить для итоговой таблицы, если в массиве нет строк?

+0

спасибо, это работает для меня –

5

Вы отметили 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(); 
} 
Смежные вопросы