J'ai un datatable. J'ai besoin d'extraire une certaine valeur de colonne en fonction de l'entrée de l'utilisateur. Par exemple, disons que le datatable a deux colonnes CountryID et CountryName.
J'ai besoin de trouver le CountryID dans le datatable en fonction du nom du pays saisi par l'utilisateur. Je pourrais simplement ouvrir une connexion avec DB et lancer la requête select countryID from Country où countryName = @userinput. Y at-il de toute façon je pourrais le faire sur le datatable.
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"];
}
}
Bien que cela puisse ne pas compiler directement, vous devriez en avoir l’idée, mais je suis sûr qu’il serait nettement supérieur de faire la requête en SQL, car un énorme datatable mettra beaucoup de temps à parcourir toutes les lignes.
Je suggère une telle méthode basée sur les méthodes d'extension:
IEnumerable<Int32> countryIDs =
dataTable
.AsEnumerable()
.Where(row => row.Field<String>("CountryName") == countryName)
.Select(row => row.Field<Int32>("CountryID"));
System.Data.DataSetExtensions.dll doit être référencé.
Les tables de données ont une méthode .Select, qui renvoie un tableau de lignes en fonction des critères que vous spécifiez. Quelque chose comme ça:
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
Bien sûr, si userinput contient le caractère ', une exception sera créée (comme si vous interrogiez la base de données). Vous devriez échapper aux caractères (j'utilise une fonction pour le faire).
Je suppose que vous pourriez utiliser un objet DataView à la place, cela vous permettrait alors de tirer parti de la propriété RowFilter, comme expliqué ici:
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");
}
Selon le titre du post, je voulais juste obtenir toutes les valeurs d'une colonne spécifique Voici le code que j'ai utilisé pour y parvenir.
public static IEnumerable<T> ColumnValues<T>(this DataColumn self)
{
return self.Table.Select().Select(dr => (T)Convert.ChangeType(dr[self], typeof(T)));
}