数据表,超过,连接
本文关键字:连接 超过 数据表 | 更新日期: 2023-09-27 18:31:13
我有一个名为sourceTable
的数据表,其中列source_Id
,title
和programme_Id
。第二个数据表credits
列credit_Id
、programme_Id
。所有列的类型均为 Int 类型,而不是列标题。
数据表credits
中的列programme_Id
是外键 FROM 数据表sourceTable
我想要实现的是使用数据表credit_Id
中的列超越表sourceTable
credits
。
我写了一个有效的代码,但很慢,有没有更好的方法!,如果没有我要查找的项目,FirstOrDefault 将输入 0,也许在这种情况下最好返回 null 值而不是 0
sourceTable.columns.Add("credits_Id");
var rowColl = credits.AsEnumerable();
foreach (DataRow row in sourceTable.Rows)
{
var credits_Id =
(from r in rowColl
where r.Field<int>("programme_Id") == Convert.ToInt32(row["programme_Id"].ToString())
select r.Field<int>("credits_Id")).FirstOrDefault<int>();
row["credits_Id"] = credits_Id;
}
它的工作速度很慢,因为您遍历源表中每一行的 credits 表中的所有行。可以使用以下 linq 查询联接这两个表。
(from sourceRow in sourceTable.Rows.OfType<DataRow>()
join creditRow in credits.Rows.OfType<DataRow>()
on sourceRow.Field<int>("programme_Id") equals creditRow.Field<int>("programme_Id")
select new {sourceRow, creditRow})
.ForEach(o => o.sourceRow["credits_id"] = o.creditRow["sourceRow"]);
以防
万一谷歌把人带到这里:这是我现在到达的问题的解决方案:)
var q = from c in sourceTable.AsEnumerable()
join o in credits.AsEnumerable() on c.Field<int>("programme_Id") equals o.Field<int>("programme_Id") into outer
from o in outer.DefaultIfEmpty()
select new
{
title=c.Field<string>("title"),
credits_Id = (o==null)?-1:o.Field<int>("credits_Id")
};
var qToList = q.ToList();
现在我们可以将此列表转换为数据表:
public static DataTable ListToDataTable<T>(List<T> list)
{
DataTable dtToConvert = new DataTable();
try
{
foreach (PropertyInfo info in typeof(T).GetProperties())
{
dtToConvert.Columns.Add(new DataColumn(info.Name, info.PropertyType));
}
foreach (T t in list)
{
DataRow row = dtToConvert.NewRow();
foreach (PropertyInfo info in typeof(T).GetProperties())
{
row[info.Name] = info.GetValue(t, null);
}
dtToConvert.Rows.Add(row);
}
} catch(Exception ex)
{
}
return dtToConvert;
}
干杯!