Как объединить две таблицы данных в другую таблицу данных - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть две таблицы данных 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 из table1 и *Известны 1019 * из table2, которые должны использоваться для отношения соединения

В настоящее время в joinTables var я получаю только anonymous DataRow - как я могу получить его в формате DataTable?

1 Ответ

0 голосов
/ 26 декабря 2018

Я использую этот метод расширения для преобразования результата 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...