我试图弄清楚如何根据查询的最大值将列附加到Linq查询结果。本质上,我想创建一个DataRows的EnumerableRowCollection,其中包含每个记录具有相同值的最大值记录。因此,如果我通过查询返回了一百条记录,我想接下来计算其中一个字段的最大值,然后将该最大值附加到原始查询表中:
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)
}
答案 0 :(得分:2)
夫妻点,首先:new DataTable()
是多余的;你实例化一个相当昂贵的对象,永远不会被使用,因为你在下一行中覆盖了引用。您应该考虑删除初始化,然后在一行上加入声明和实际赋值。
了解真正的问题。 DataRows不能直接添加列;您必须将列添加到包含这些行的整个DataTable。完成后,只需设置值即可。只要您不需要将操作转换为SQL等外部查询语言,就可以使用monadic扩展方法内联此操作:
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;
}