Linq: sélectionne une valeur dans une colonne datatable
Comment utilisez-vous LINQ (C#)
pour sélectionner la valeur d'une colonne particulière pour une ligne particulière d'un datatable
L'équivalent SQL
serait:
select NAME from TABLE where ID = 0
Merci d'avance.
var name = from r in MyTable
where r.ID == 0
select r.Name;
Si la ligne est unique, vous pouvez même simplement faire:
var row = DataContext.MyTable.SingleOrDefault(r => r.ID == 0);
var name = row != null ? row.Name : String.Empty;
Merci pour vos réponses. Je ne comprenais pas quel type d'objet "MyTable" était (dans vos réponses) et le code suivant m'a donné l'erreur ci-dessous.
DataTable dt = ds.Tables[0];
var name = from r in dt
where r.ID == 0
select r.Name;
Impossible de trouver une implémentation du motif de requête pour le type de source 'System.Data.DataTable'. 'Où' non trouvé
Alors j'ai continué ma recherche sur Google et j'ai trouvé quelque chose qui fonctionne:
var rowColl = ds.Tables[0].AsEnumerable();
string name = (from r in rowColl
where r.Field<int>("ID") == 0
select r.Field<string>("NAME")).First<string>();
Qu'est-ce que tu penses?
J'ai remarqué que d'autres ont donné la syntaxe non-lambda, alors pour compléter, je vais utiliser l'équivalent lambda:
Non-lambda (d'après le message de James):
var name = from i in DataContext.MyTable
where i.ID == 0
select i.Name
Syntaxe lambda équivalente:
var name = DataContext.MyTable.Where(i => i.ID == 0)
.Select(i => new { Name = i.Name });
Il n'y a pas vraiment beaucoup de différence pratique, juste une opinion personnelle sur laquelle vous préférez.
Si la valeur de retour est une chaîne et que vous devez rechercher par ID, vous pouvez utiliser:
string name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name")).ToString();
ou en utilisant une variable générique:
var name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name"));
Utilisez linq et définissez la table de données sur Enumerable, puis sélectionnez les champs du champ de la table de données qui correspondent à ce que vous recherchez.
Exemple
Je souhaite obtenir l'ID et le nom de la devise dans la table des devises où la devise est la devise locale, puis attribuer l'ID et le nom de la devise à une zone de texte du formulaire:
DataTable dt = curData.loadCurrency();
var curId = from c in dt.AsEnumerable()
where c.Field<bool>("LocalCurrency") == true
select c.Field<int>("CURID");
foreach (int cid in curId)
{
txtCURID.Text = cid.ToString();
}
var curName = from c in dt.AsEnumerable()
where c.Field<bool>("LocalCurrency") == true
select c.Field<string>("CurName");
foreach (string cName in curName)
{
txtCurrency.Text = cName.ToString();
}
var name = from DataRow dr in tblClassCode.Rows where (long)dr["ID"] == Convert.ToInt32(i) select (int)dr["Name"]).FirstOrDefault().ToString()
var x = from row in table
where row.ID == 0
select row
En supposant que vous ayez un DataTable connaissant les lignes, vous devrez utiliser l'index de ligne:
where row[rowNumber] == 0
Dans ce cas, vous voudriez également utiliser la sélection pour placer les données de ligne dans une classe anonyme ou une classe préparée à l'avance (si vous souhaitez la transmettre à une autre méthode).