将 linq 结果集转换为数据表
本文关键字:数据表 转换 linq 结果 | 更新日期: 2023-09-27 18:30: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();
是的,您需要使用以下扩展方法:
public static DataTable CopyToDataTable<T>(this IEnumerable<T> source) where T : DataRow
但首先你需要有IEnumerable<DataRow>
,但不是匿名类型。
您的表应包含要填充的列,然后使用DateTable.NewRow()
方法
假设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);
}
}
注意:您只能在现有数据行上使用CopyToDataTable
,而不能对匿名类型使用。因此,您要么需要先选择这些行以将它们复制到新DataTable
中,要么(当架构与此处不同时,因为您要添加HandTotal
)您需要手动创建一个新DataTable
,这就是我所做的。
这是一种你可以实现的方式,你想要的。
您的 LINQ 查询,下面是一个返回数据表的函数:
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;
}
query.First().HandTotal.ToString()
这样,我可以在第一行找到手牌总数,因此我不需要将我的 linq 查询结果集放在数据表中。我要对KMP先生说声谢谢。