Linq查询:追加列查询结果
问题描述:
我想弄清楚如何追加一列到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)
}
答
夫妻积分第一: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;
}