DataTable.Select() не работает

В моей таблице данных у меня есть две строки с несколькими столбцами.

Один из столбцов — ItemID, а их значения — 2215,2216.

Когда я использую следующее утверждение:

DataRow[] dr = dt.Select("ItemID='2215'");

Он возвращает обе строки. Это не фильтрация.

Что мне не хватает?


person Singaravelan    schedule 30.12.2013    source источник


Ответы (7)


Это должно работать, если в вашей таблице есть данные с описанной вами структурой.

var dr = from row in dt.AsEnumerable()
    where row.Field<int>("ItemID") == 2215
    select row;

DataTable dtSelected = dr.CopyToDataTable();
person Neeraj Kumar Gupta    schedule 30.12.2013

Попробуйте так

DataRow[] dr = dt.Select("ItemID=2215");
person Nagaraj S    schedule 30.12.2013

Ваш ItemID может иметь тип int, в типе int нет необходимости в одинарных кавычках.

попробуй это

DataRow[] dr = dt.Select("ItemID=2215");
person Sid M    schedule 30.12.2013
comment
Каков тип данных ItemID? - person Sid M; 30.12.2013
comment
тип данных Int32 - person Singaravelan; 30.12.2013
comment
Ок, попробуй, DataRow[] dr = dt.Select("Convert(ItemID, 'System.String') ='2215'"); - person Sid M; 30.12.2013
comment
это также возвращает все строки. Также DataTable dtCloned = dt.Clone(); dtCloned.Columns[ItemID].DataType = typeof(Int32); foreach (строка DataRow в dt.Rows) { dtCloned.ImportRow(row); } dr = dt.Select(Convert(ItemID, 'System.Int32') =2215); НовыйDR = др[0]; это также возвращает обе строки - person Singaravelan; 30.12.2013
comment
@SidM Извините, но ваш ответ решил не мою проблему, а ваш комментарий! В котором говорится, что dt.Select(Convert(ItemID.... и т. д.). Так что нельзя голосовать за ваш ответ, так как это может ввести в заблуждение читателей и тех, кто пытается решить проблему этого вопроса. - person Aditya Bokade; 01.04.2014

Попробуй это:

foreach (DataRow row in ds.Tables[0].Select("PeriodName='" + dr["PeriodName"].ToString() + "'")){
    row["PeriodName"].ToString()
}
person user7378887    schedule 05.01.2017
comment
@NahuelIanni Ответ только для кода может быть не очень хорошим, но это все же ответ. Я бы порекомендовал вам этот пост о LQPRQ: Вы делаете это неправильно: призыв к здравомыслию в очереди сообщений низкого качества - person FelixSFD; 05.01.2017

Основываясь на комментарии @SidM, я использовал этот подход

DataRow[] dr = dt.Select("Convert(ItemID, 'System.Int32') =2215");

Это должно работать

person Christoph Adamakis    schedule 31.07.2017

если itemID является целым числом, то вы не знаете одинарных кавычек.

DataRow[] dr = dt.Select("ItemID=2215");
person Ehsan    schedule 30.12.2013

Сегодня у меня была очень похожая проблема, и я обнаружил, что она как-то связана с предыдущими изменениями в таблице данных, которые еще не были приняты. Попробуйте принять изменения перед вызовом .Select(...). Кроме того, как уже упоминалось, вам не нужны одинарные кавычки, если ItemID всегда является int (хотя я не верю, что это является причиной ваших проблем).

dt.AcceptChanges();
DataRow[] dr = dt.Select("ItemID=2215");

Я также пытался добавить практически все комбинации фильтров DataViewRowState, но ни одна комбинация не сработала! Некоторые не возвращали никаких записей, некоторые возвращали только измененные записи (хотя я включил Unchanged).

DataRow[] dr = dt.Select("ItemID=2215",
    DataViewRowState.OriginalRows|DataViewRowState.CurrentRows);

Примечание. OriginalRows | CurrentRows будет эквивалентом «всех состояний строк». Пробовал и другие комбинации.

person Drew Chapin    schedule 25.04.2017