【问题标题】:Linq query: append column to query resultsLinq 查询:将列追加到查询结果
【发布时间】:2011-01-13 01:57:35
【问题描述】:

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

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    偶点,第一: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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多