【问题标题】:Converting linq result set to data table将 linq 结果集转换为数据表
【发布时间】:2012-04-11 11:09:48
【问题描述】:
var query = (from row in playerSpotAndValue.AsEnumerable()
             where !row.Field<string>("RunningTotal").Contains("/")
             group row by row.Field<UInt16>("SpotID") into spotID
             orderby spotID.Key
             select new
             {
                 SpotID = spotID.Key,
                 HandTotal= spotID.Max(p => Convert.ToUInt16(p.Field<string>("RunningTotal"))),
                 RowsCount = spotID.Count()
             }); 

如何在这个查询中使用 CopyToDataTable 以便我可以这样查询

query.CopyToDataTable().Rows[0]["HandTotal"].ToString();

【问题讨论】:

  • 顺便说一句,您可以通过执行 query.First().HandTotal.ToString() 来实现您想要的查询,它会为您节省一些内存和时间。
  • 您是否尝试过使用Expression-based Fields 来达到同样的效果?
  • @kmp:请把这个作为你的答案,我会接受的。谢谢
  • @Mohan - 我会这样做(我会喜欢声誉积分)但您的问题是询问如何将查询放入数据表中,而其他一些人已经很好地回答了您的问题问题。我给了你一个替代的想法,这并不是你所问问题的真正答案,所以我认为如果我把它作为答案而你要接受它。

标签: c# .net linq linq-to-sql ado.net


【解决方案1】:

是的,您需要使用以下extension method

public static DataTable CopyToDataTable<T>(this IEnumerable<T> source) where T : DataRow

但首先你需要有IEnumerable&lt;DataRow&gt; 但不是匿名类型。

您的表格应该有您要填充的列,然后使用DateTable.NewRow() 方法

【讨论】:

    【解决方案2】:

    假设dtDealerTotal(最初在您的问题中引用)是您想要从查询中找到带有SpotID 的行的表,并且您想要将HandTotal 结果添加为DataColumn

    DataTable result = dtDealerTotal.Clone();
    result.Columns.Add(new DataColumn("HandTotal", typeof(UInt16)));
    var dealers = dtDealerTotal.AsEnumerable();
    foreach (var x in query)
    {
        foreach (var d in dealers.Where(dr => dr.Field<UInt16>("SpotID") == x.SpotID))
        {
            var fields = d.ItemArray;
            fields.Concat(new Object[] { x.HandTotal });
            result.Rows.Add(fields);
        }
    }
    

    注意:您只能在现有 DataRows 上使用 CopyToDataTable,而不能在匿名类型上使用。因此,您要么需要先选择这些行以将它们复制到新的DataTable 中,要么(当架构与此处不同时,因为您要添加HandTotal)您需要手动创建一个新的DataTable,即我做了什么。

    【讨论】:

      【解决方案3】:

      这是一种你可以实现的方式,你想要什么。

      您的 LINQ 查询,这是一个返回 DataTable 的函数:

      public static DataTable ToDataTable(DataContext ctx, object query) // ctx is your data context, & query is your linq query 
      {
          IDbCommand cmd;
      
          try
          {
              cmd = ctx.GetCommand(query as IQueryable);
          }
          catch
          {
              throw new Exception("Could not connect database");
          }
      
          SqlDataAdapter adapter = new SqlDataAdapter();
          adapter.SelectCommand = (SqlCommand)cmd;
          DataTable dt = new DataTable();
      
          try
          {
              cmd.Connection.Open();
      
          }
          catch
          {
              cmd.Connection.Close();
              throw new Exception("Could not connect database");
          }
      
          try
          {
              adapter.Fill(dt);
              cmd.Connection.Close();
          }
          catch(Exception ex)
          {
              cmd.Connection.Close();
              throw new Exception("Query Parsing Error");
          }
      
          return dt;
      }
      

      【讨论】:

      • 请不要从答案中复制粘贴。
      【解决方案4】:
      query.First().HandTotal.ToString() 
      

      这样我可以在第一行找到手数,因此我不需要将我的 linq 查询结果集放在数据表中。我要感谢kmp先生。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        • 2018-11-29
        相关资源
        最近更新 更多