Ответ 1
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();
У меня есть datatable. Мне нужно получить определенное значение столбца на основе ввода пользователя. Например, предположим, что у datatable есть два столбца CountryID и CountryName.
Мне нужно найти CountryID в datatable на основе имени страны ввода пользователя. Я мог бы просто открыть соединение с БД и запустить запрос select countryID из страны, где countryName = @userinput. В любом случае я могу сделать это на основе данных.
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();
foreach (DataRow row in Datatable.Rows)
{
if (row["CountryName"].ToString() == userInput)
{
return row["CountryID"];
}
}
В то время как это может не скомпилироваться напрямую, вы должны получить эту идею, также я уверен, что это будет намного лучше, чем запрос через SQL, поскольку огромный datatable займет много времени, чтобы пробежать все строки.
Я предлагаю такой способ на основе методов расширения:
IEnumerable<Int32> countryIDs =
dataTable
.AsEnumerable()
.Where(row => row.Field<String>("CountryName") == countryName)
.Select(row => row.Field<Int32>("CountryID"));
Необходимо указать ссылку на System.Data.DataSetExtensions.dll.
Я предполагаю, что вы могли бы использовать объект 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");
}
У 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 содержит "символ", это приведет к возникновению исключения (например, если вы запрашиваете базу данных). Вам следует избегать символов (я использую функцию для этого).
По названию поста мне просто нужно было получить все значения из определенного столбца. Вот код, который я использовал для этого.
public static IEnumerable<T> ColumnValues<T>(this DataColumn self)
{
return self.Table.Select().Select(dr => (T)Convert.ChangeType(dr[self], typeof(T)));
}