我有三张 Datatable 类型的表格:
Table1: Id<Int64>, ParamX<string>;
Table2: Id<Int64>;
Table3: Id<Int64>, ParamA<double>, ParamB<Int16>;
我想通过ID字段加入它们,并使用计算字段ParamC<double>=ParamA<double>*ParamB<Int16>
结果应为数据表:
Table4: Id<Int64>, ParamX<string>, ParamA<double>, ParamB<Int16>, ParamC<double>
是否可以在单个LINQ查询中进行? madace
答案 0 :(得分:2)
您无法在LINQ查询中创建或填充表,查询不应导致副作用。您可以使用LINQ准备要插入新表的数据:
var query = from r1 in Table1.AsEnumerable()
join r2 in Table2.AsEnumerable()
on r1.Field<long>("ID") equals r2.Field<long>("ID")
join r3 in Table3.AsEnumerable()
on r2.Field<long>("ID") equals r3.Field<long>("ID")
select new {
ID = r1.Field<long>("ID"),
ParamX = r1.Field<string>("ParamX"),
ParamA = r3.Field<double>("ParamA"),
ParamB = r3.Field<short>("ParamB"),
ParamC = r3.Field<double>("ParamA") * r3.Field<short>("ParamB")
};
var Table4 = new DataTable();
Table4.Columns.Add("ID", typeof(long));
Table4.Columns.Add("ParamX", typeof(string));
Table4.Columns.Add("ParamA", typeof(double));
Table4.Columns.Add("ParamB", typeof(short));
Table4.Columns.Add("ParamC", typeof(double));
使用循环执行查询并将行插入表中:
foreach (var x in query)
{
DataRow addedRow = Table4.Rows.Add();
addedRow.SetField("ID", x.ID);
addedRow.SetField("ParamX", x.ParamX);
addedRow.SetField("ParamA", x.ParamA);
addedRow.SetField("ParamB", x.ParamB);
addedRow.SetField("ParamC", x.ParamC);
}
对于它的价值,这是一种扩展方法,允许通过反射从DataTable
创建IEnumerable<anything>
:
public static class Extensions
{
public static DataTable ToDataTable<T>(this IEnumerable<T> data)
{
PropertyDescriptorCollection props =
TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
for (int i = 0; i < props.Count; i++)
{
PropertyDescriptor prop = props[i];
table.Columns.Add(prop.Name, prop.PropertyType);
}
object[] values = new object[props.Count];
foreach (T item in data)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = props[i].GetValue(item);
}
table.Rows.Add(values);
}
return table;
}
}
然后您无需手动创建或填充表格:
DataTable Table4 = query.ToDataTable();