2013-12-17 2 views
25

У меня есть два столбца в DataTable:Найти грести в DataTable с конкретным идентификатором

ID, Calls. 

Как найти то, что стоимость звонков where ID = 5?

5 может быть anynumber, его только, например. Каждая строка имеет уникальный идентификатор.

+0

Не могли бы вы сделать это как часть инструкции select? "SELECT ID, вызовы FROM MyTable WHERE ID = @ id_search". Затем просто укажите параметр «@id_search» для вызова базы данных. Это будет быстрее, чем LINQ, особенно если предположить, что идентификатор является первичным ключом или индексирован. –

+0

Не база данных, набор данных/datatable im fear. – RSM

ответ

45

Сформируйте строку критерии для поиска, например:

string searchExpression = "ID = 5" 

Затем используйте .Select() метод DataTable объект, например:

DataRow[] foundRows = YourDataTable.Select(searchExpression); 

Теперь вы можете перебрать результаты, как это:

int numberOfCalls; 
bool result; 
foreach(DataRow dr in foundRows) 
{ 
    // Get value of Calls here 
    result = Int32.TryParse(dr["Calls"], out numberOfCalls); 

    // Optionally, you can check the result of the attempted try parse here 
    // and do something if you wish 
    if(result) 
    { 
     // Try parse to 32-bit integer worked 

    } 
    else 
    { 
     // Try parse to 32-bit integer failed 

    } 
} 
+0

Это даёт мне datarow, но как мне получить конкретное значение из вызовов столбца – RSM

+0

@RyanMurphy - обновленный ответ, чтобы показать, как получить значение из строки и безопасно попытаться проанализировать значение. –

+0

Спасибо за помощь помощник – RSM

33

Вы можете использовать LINQ для DataSet/DataTable

var rows = dt.AsEnumerable() 
       .Where(r=> r.Field<int>("ID") == 5); 

Поскольку каждая строка имеет уникальный идентификатор, который Вы должны использовать Single/SingleOrDefault, который будет бросать исключение, если вы получите несколько записей назад.

DataRow dr = dt.AsEnumerable() 
       .SingleOrDefault(r=> r.Field<int>("ID") == 5); 

(Заменитель int для типа вашего поля идентификатора)

+1

Некоторое время не удалось выбрать строки из таблицы, используя этот «DataRow [] foundRows = YourDataTable.Select (searchExpression);». Но когда я использую LINQ. Его работа хорошая. Спасибо, Хабиб. –

+1

Спасибо! Мне нравится LINQ. –

3
DataRow dataRow = dataTable.AsEnumerable().FirstOrDefault(r => Convert.ToInt32(r["ID"]) == 5); 
if (dataRow != null) 
{ 
    // code 
} 

Если это типизированный DataSet:

MyDatasetType.MyDataTableRow dataRow = dataSet.MyDataTable.FirstOrDefault(r => r.ID == 5); 
if (dataRow != null) 
{ 
    // code 
} 
11

Вы можете попробовать метод выбора

DataRow[] rows = table.Select("ID = 7"); 
0

введите код

DataRow foundRow = FinalDt.Rows.Find(Value); 

но установить в аренде один первичный ключ

1

Здравствуйте просто создать простую функцию, которая выглядит, как показано ниже .. Это возвращает все строки, где параметр вызова введенный действительный или истинный.

public DataTable SearchRecords(string Col1, DataTable RecordDT_, int KeyWORD) 
    { 
     TempTable = RecordDT_; 
     DataView DV = new DataView(TempTable); 
     DV.RowFilter = string.Format(string.Format("Convert({0},'System.String')",Col1) + " LIKE '{0}'", KeyWORD); 
     return DV.ToTable(); 
    } 

и просто назовите его, как показано ниже;

DataTable RowsFound=SearchRecords("IdColumn", OriginalTable,5); 

где 5 - ID. Спасибо ..

4

Я мог бы использовать следующий код. Спасибо всем.

int intID = 5; 
DataTable Dt = MyFuctions.GetData(); 
Dt.PrimaryKey = new DataColumn[] { Dt.Columns["ID"] }; 
DataRow Drw = Dt.Rows.Find(intID); 
if (Drw != null) Dt.Rows.Remove(Drw); 
0

Старайтесь избегать ненужных циклов и, если необходимо, пойдите для этого.

string SearchByColumn = "ColumnName=" + value; 
DataRow[] hasRows = currentDataTable.Select(SearchByColumn); 
if (hasRows.Length == 0) 
{ 
    //your logic goes here 
} 
else 
{ 
    //your logic goes here 
} 

Если вы хотите выполнить поиск по определенному идентификатору, тогда в таблице должен быть первичный ключ.

Смежные вопросы