2011-01-12 209 views
1

我想弄清楚如何追加一列到Linq查詢結果基於查詢的最大值。從本質上講,我想創建一個DataRows的EnumerableRowCollection,它將包含每條記錄具有相同值的最大值記錄。所以,如果我有一百個記錄通過該查詢返回,我想下一次計算中的一個字段的最大值,則該最大值追加到原始查詢表:Linq查詢:追加列查詢結果

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

這裏就是我需要幫助:

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

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

回答

2

夫妻積分第一:new DataTable()是多餘的;你正在實例化一個相當昂貴的對象,它永遠不會被使用,因爲你正在覆蓋下一行中的引用。您應該考慮刪除初始化,然後在一行中加入聲明和實際分配。

找到真正的問題。 DataRows不能將列直接添加到它們;您必須將列添加到包含這些行的整個DataTable。一旦完成,只需設置值。只要您不需要將操作轉換爲SQL等外部查詢語言,就可以使用一元擴展方法內聯該操作:

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; 
}