2011-01-12 8 views
1

Ich versuche herauszufinden, wie eine Spalte an Linq Abfrageergebnisse basierend auf dem maximalen Wert der Abfrage anhängen. Im Wesentlichen möchte ich eine EnumerableRowCollection von DataRows erstellen, die einen Max-Wert-Datensatz mit demselben Wert für jeden Datensatz enthalten würde. Also, wenn ich hundert Datensätze durch die Abfrage zurückgegeben haben, möchte ich den maximalen Wert von einem der Felder neben berechnen, fügen Sie dann diesen Maximalwert auf den ursprünglichen Abfrage-Tabelle:Linq Abfrage: Spalte an Abfrageergebnisse anfügen

DataTable dt = new DataTable(); 
dt = myDataSet.myDataTable; 

EnumerableRowCollection<DataRow> qrySelectRecords = 
      (from d in dt.AsEnumerable() 
      where d.Field<DateTime>("readingDate") >= startDate && g.Field<DateTime>("readingDate") <= endDate 
      select d); 

Hier ist, wo ich Hilfe benötigen:

double maxValue = qrySelectRecords.Field<double>("field1").Max(); 

foreach (DataRow dr in qrySelectRecords) 
{ 
qrySelectRecords.Column.Append(maxValue) 
} 

Antwort

2

Koppelpunkte, zuerst: new DataTable() ist redundant; Sie instanziieren ein ziemlich teures Objekt, das niemals verwendet wird, weil Sie die Referenz in der nächsten Zeile überschreiben. Sie sollten in Betracht ziehen, die Initialisierung zu entfernen und dann die Deklaration und die tatsächliche Zuweisung in einer Zeile zu verknüpfen.

Die richtige Frage zu bekommen. DataRows kann keine Spalten direkt hinzufügen. Sie müssen die Spalte zur gesamten DataTable hinzufügen, die diese Zeilen enthält. Sobald dies erledigt ist, legen Sie einfach den Wert fest. Solange Sie die Operation nicht in eine externe Abfragesprache wie SQL übersetzt haben, können Sie diese Operation mit einer monadischen Erweiterungsmethode inline einbinden:

DataTable dt = myDataSet.myDataTable; 
dt.Columns.Add("MaxField1"); 

EnumerableRowCollection<DataRow> qrySelectRecords = 
      (from d in dt.Rows().AsEnumerable().OfType<DataRow>() 
      where d.Field<DateTime>("readingDate") >= startDate 
       && d.Field<DateTime>("readingDate") <= endDate 
      let m = dt.AsEnumerable().Max(dr=>dr.Field<double>("field1")) 
      select d.WithColumnSet("MaxField1", m)); 

... 

public static DataRow WithColumnSet(this DataRow input, string columnName, object value) 
{ 
    input[columnName] = value; 
    return input; 
}