c# - 如何将两个数据表加入另一个数据表
问题描述
我有两个数据表table1
和table2
。我想加入它们,从而在C#
. 这两个表的所有列都是未知的。
这是我尝试过的:
var joinTables = from t1 in table1.AsEnumerable()
join t2 in table2.AsEnumerable() on t1["S_InstanceID"] equals t2["P_ID"]
select new { T1 = t1, T2 = t2 };
注意:两个表中没有同名的列
table1
将始终只有一行,但table2
可以有任意数量的行。
不知道所有列,只知道必须用于连接关系的S_InstanceID
fromtable1
和P_ID
fromtable2
目前在joinTables
var 中,我只得到anonymous DataRow
- 我怎样才能得到它的DataTable
格式?
解决方案
我使用此扩展方法将 LINQ 结果转换回DataTable
专门用于join
:
// Create new DataTable from LINQ results on DataTable
// Expect T to be anonymous object of form new { DataRow d1, DataRow d2, ... }
public static DataTable FlattenToDataTable<T>(this IEnumerable<T> src) {
var res = new DataTable();
if (src.Any()) {
var firstRow = src.First();
var rowType = typeof(T);
var memberInfos = rowType.GetPropertiesOrFields();
var allDC = memberInfos.SelectMany(mi => mi.GetValue<DataRow>(firstRow).Table.DataColumns());
foreach (var dc in allDC) {
var newColumnName = dc.ColumnName;
if (res.ColumnNames().Contains(newColumnName)) {
var suffixNumber = 1;
while (res.ColumnNames().Contains($"{newColumnName}.{suffixNumber}"))
++suffixNumber;
newColumnName = $"{newColumnName}.{suffixNumber}";
}
res.Columns.Add(new DataColumn(newColumnName, dc.DataType));
}
foreach (var objRows in src)
res.Rows.Add(memberInfos.SelectMany(mi => mi.GetValue<DataRow>(objRows).ItemArray).ToArray());
}
return res;
}
// ***
// *** Type Extensions
// ***
public static List<MemberInfo> GetPropertiesOrFields(this Type t, BindingFlags bf = BindingFlags.Public | BindingFlags.Instance) =>
t.GetMembers(bf).Where(mi => mi.MemberType == MemberTypes.Field | mi.MemberType == MemberTypes.Property).ToList();
// ***
// *** MemberInfo Extensions
// ***
public static object GetValue(this MemberInfo member, object srcObject) {
switch (member) {
case FieldInfo mfi:
return mfi.GetValue(srcObject);
case PropertyInfo mpi:
return mpi.GetValue(srcObject);
default:
throw new ArgumentException("MemberInfo must be of type FieldInfo or PropertyInfo", nameof(member));
}
}
public static T GetValue<T>(this MemberInfo member, object srcObject) => (T)member.GetValue(srcObject);
推荐阅读
- ruby - 重新定义一个 singleton_class 方法使其行为与以前完全一样,但也可以做其他事情
- python - 如何在转置层之间绑定权重?
- java - Listview 项目没有被删除
- node.js - 在 NODEJS 应用程序中的 npm 审计修复出现错误 2 漏洞需要手动审查并且无法更新之后
- sql - 如何将 msdb 从 SQL Server 迁移到 Azure SQL 数据库?
- c++ - 模板化的朋友声明在 g++ 5.4.0 下不起作用——编译器错误或错误代码?
- angular - 如何解决此错误找不到模块:错误:无法解析“fs”
- ghost-blog - 语法突出显示不适用于 Prismjs
- css - 使用 Jekyll 使用 SCSS 更新 CSS
- opengl - 仅对 x 和 y 应用透视划分?