将linq结果集转换为数据表

时间:2012-04-11 11:09:48

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

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();

4 个答案:

答案 0 :(得分:1)

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

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

但首先你需要IEnumerable<DataRow>而不是匿名类型。

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

答案 1 :(得分:1)

假设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),您需要创建一个新的{{1手动,这就是我做的。

答案 2 :(得分:0)

这是你可以实现的,你想要的。

您的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;
}

答案 3 :(得分:0)

query.First().HandTotal.ToString() 

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