it-swarm.com.de

Linq: Wert in einer datierbaren Spalte auswählen

Wie können Sie mit LINQ (C#) den Wert in einer bestimmten Spalte für eine bestimmte Zeile in einer datatable auswählen. Das Äquivalent SQL wäre:

select NAME from TABLE where ID = 0

Danke im Voraus.

27
ianbeks
var name = from r in MyTable
            where r.ID == 0
            select r.Name;

Wenn die Zeile eindeutig ist, können Sie sogar Folgendes tun:

var row = DataContext.MyTable.SingleOrDefault(r => r.ID == 0);
var name = row != null ? row.Name : String.Empty;
19
James

Danke für deine Antworten. Ich verstand nicht, um welche Art von Objekt "MyTable" es sich handelt (in Ihren Antworten), und der folgende Code gab mir den unten gezeigten Fehler.

DataTable dt = ds.Tables[0];
var name = from r in dt
           where r.ID == 0
           select r.Name;

Es wurde keine Implementierung des Abfragemusters für Quelltyp .__ gefunden. 'System.Data.DataTable'. 'Wo' nicht gefunden

Also habe ich weiter gegoogelt und etwas gefunden, das funktioniert:

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>();

Was denkst du?

26
ianbeks

Ich habe festgestellt, dass andere die Nicht-Lambda-Syntax angegeben haben. Um dies zu vervollständigen, werde ich das Äquivalent der Lambda-Syntax einfügen:

Nicht-Lambda (gemäß James Post):

var name = from i in DataContext.MyTable
           where i.ID == 0
           select i.Name

Äquivalente Lambda-Syntax:

var name = DataContext.MyTable.Where(i => i.ID == 0)
                              .Select(i => new { Name = i.Name });

Es gibt nicht wirklich praktische Unterschiede, nur die persönliche Meinung, die Sie bevorzugen.

7
fyjham

Wenn der Rückgabewert string ist und Sie nach ID suchen müssen, können Sie Folgendes verwenden:

string name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name")).ToString();

oder mit generischer Variable:

var name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name"));
1
mbadeveloper

Verwenden Sie linq und legen Sie die Datentabelle als Enumerable fest. Wählen Sie die Felder aus dem Datentabellenfeld aus, die Ihren Suchkriterien entsprechen.

Beispiel

Ich möchte die Währungs-ID und den Währungsnamen aus der Währungstabelle erhalten, in der die Währung die Landeswährung ist, und die Währungs-ID und den Namen einem Textfeld im Formular zuweisen:

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() 
var x  =  from row in table
          where row.ID == 0
          select row

Angenommen, Sie haben eine DataTable, die über die Zeilen Bescheid weiß, andernfalls müssen Sie den Zeilenindex verwenden:

where row[rowNumber] == 0

In diesem Fall möchten Sie auch select verwenden, um die Zeilendaten in eine anonyme Klasse oder eine vorbereitete Klasse zu platzieren (wenn Sie sie an eine andere Methode übergeben möchten)

0
Chris