2011-01-12 20 views
1

私は、クエリの最大値に基づいてLinqクエリ結果に列を追加する方法を理解しようとしています。基本的には、各レコードに対して同じ値を持つ最大値レコードを含むDataRowの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()は冗長です。次の行で参照を上書きしているため、決して使用されないかなり高価なオブジェクトをインスタンス化しています。初期化を削除し、宣言と実際の代入を1行にまとめることを検討する必要があります。

実際の質問になる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; 
} 
関連する問題