web-dev-qa-db-fra.com

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.

27
ianbeks
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;
19
James

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?

26
ianbeks

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.

7
fyjham

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"));
1
mbadeveloper

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();
            }
0
Ashraf Abusada
var name = from DataRow dr in tblClassCode.Rows where (long)dr["ID"] == Convert.ToInt32(i) select (int)dr["Name"]).FirstOrDefault().ToString() 
0
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).

0
Chris