2011-01-12 168 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; 
}