Linq查询:将列追加到查询结果中

时间:2011-01-12 17:34:08

标签: c# .net linq

我试图弄清楚如何根据查询的最大值将列附加到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)
}

1 个答案:

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