it-swarm.com.ru

Как получить конкретное значение столбца из таблицы данных?

У меня есть данные. Мне нужно получить определенное значение столбца на основе пользовательского ввода. Например, предположим, что таблица данных имеет два столбца CountryID и CountryName.

Мне нужно найти CountryID в таблице данных на основе имени страны ввода пользователя. Я мог бы просто открыть соединение с БД и выполнить запрос выбора countryID из страны, где countryName = @userinput. В любом случае, я мог бы сделать это на основе данных.

33
peace
string countryName = "USA";
DataTable dt = new DataTable();
int id = (from DataRow dr in dt.Rows
              where (string)dr["CountryName"] == countryName
              select (int)dr["id"]).FirstOrDefault();
62
Seattle Leonard
foreach (DataRow row in Datatable.Rows) 
{
    if (row["CountryName"].ToString() == userInput) 
    {
        return row["CountryID"];
    }
}

Хотя это может не скомпилироваться напрямую, вы должны понять, но я уверен, что было бы намного лучше выполнить запрос через SQL, поскольку для обработки огромных данных требуется много времени, чтобы пройти по всем строкам.

17
Jimmy

Я предлагаю такой способ на основе методов расширения:

IEnumerable<Int32> countryIDs =
    dataTable
    .AsEnumerable()
    .Where(row => row.Field<String>("CountryName") == countryName)
    .Select(row => row.Field<Int32>("CountryID"));

System.Data.DataSetExtensions.dll должна быть ссылка.

9
Deilan

В Datatables есть метод .Select, который возвращает массив строк в соответствии с указанными вами критериями. Что-то вроде этого:

Dim oRows() As DataRow

oRows = dtCountries.Select("CountryName = '" & userinput & "'")

If oRows.Count = 0 Then
   ' No rows found
Else
   ' At least one row found. Could be more than one
End If

Конечно, если userinput содержит символ ', это вызовет исключение (например, если вы запрашиваете базу данных). Вы должны экранировать символы (я использую функцию для этого).

1
ACB

Я предполагаю, что вы могли бы использовать объект DataView вместо этого, тогда это позволило бы вам воспользоваться преимуществом свойства RowFilter, как описано здесь:

http://msdn.Microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx

private void MakeDataView() 
{
    DataView view = new DataView();

    view.Table = DataSet1.Tables["Countries"];
    view.RowFilter = "CountryName = 'France'";
    view.RowStateFilter = DataViewRowState.ModifiedCurrent;

    // Simple-bind to a TextBox control
    Text1.DataBindings.Add("Text", view, "CountryID");
}
1
Dal

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

    public static IEnumerable<T> ColumnValues<T>(this DataColumn self)
    {
        return self.Table.Select().Select(dr => (T)Convert.ChangeType(dr[self], typeof(T)));
    }
0
cdiggins