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.
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;
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?
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.
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"));
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();
}
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)