Используйте .Select (). Join (), чтобы объединить две таблицы данных - PullRequest
0 голосов
/ 28 июня 2018

Я искал высоко и низко это безрезультатно. У меня есть две DataTable, к которым я хочу присоединиться без , создав новую результирующую таблицу, поскольку мне просто нужно обновить некоторые строки в одной из таблиц, чтобы они отображались в виде сетки, аналогично приведенному ниже коду, но с объединение:

sage_invoices.Select("CCE2 IS NULL")
                .ToList<DataRow>()
                .ForEach(row =>
                {
                    row["Error"] = 1;
                    row["ErrorMessage"] = "Missing Region Code (Dimension 2 - CCE2)";
                });

Все, что я нашел, производит новый выходной файл, похожий на приведенный ниже код:

var collection = from t1 in dt1.AsEnumerable()
         join t2 in dt2.AsEnumerable()
         on t1["id"] equals t2["id"]
         select new { T1 = t1, T2 = t2 };

Что я не могу найти, так это соединить две таблицы данных с помощью .Join:

sage_invoices.Select()
                .Join(<What Goes here?>)
                .ToList<DataRow>()
                .ForEach(row =>
                {
                    row["Error"] = 1;
                    row["ErrorMessage"] = "ITMREF is not a Sage Product Code";
                });

Если бы кто-нибудь мог указать мне правильное направление, я был бы очень признателен.

Спасибо Gareth

1 Ответ

0 голосов
/ 28 июня 2018

Обычно я выполняю это, создавая анонимный объект, который содержит ссылку на мои исходные и целевые объекты через Join или GroupJoin, а затем перебираю результат Join для обновления моего целевого объекта. Смотрите пример ниже.

Посмотрите документацию по Присоединитесь и GroupJoin . Присоединение отлично подходит для совпадения 1-1, в то время как GroupJoin соответствует 0- * (как левое соединение SQL). Аргументы Join и GroupJoin позволяют вам указать функцию выбора для каждого IEnumerable, за которым следует функция выбора для выходного объекта. Обратите внимание, что t1 и t2 ниже относятся к table1 и table2.

using System;
using System.Data;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var table1 = GetEmptyTable();
        table1.Rows.Add(1, "Old Value", false);
        table1.Rows.Add(2, "Untouched Value", false);

        var table2 = GetEmptyTable();
        table2.Rows.Add(1, "New Value", false);
        table2.Rows.Add(3, "Unused Value", false);

        Console.WriteLine("Before...");
        Console.WriteLine(PrintTable(table1));

        var matched = table1.Select()
            .Join(table2.Select(), t1 => (int)t1["A"], t2 => (int)t2["A"], (t1, t2) 
=> new
            {
                DestinationRow = t1,
                SourceRow = t2
            });
        foreach (var match in matched)
        {
            match.DestinationRow["B"] = match.SourceRow["B"];
            match.DestinationRow["C"] = true;
        }

        Console.WriteLine("After...");
        Console.WriteLine(PrintTable(table1));
    }

    private static DataTable GetEmptyTable()
    {
        var table = new DataTable();
        table.Columns.Add("A", typeof(int));
        table.Columns.Add("B", typeof(string));
        table.Columns.Add("C", typeof(bool));
        return table;
    }

    private static string PrintTable(DataTable table)
    {
        return string.Join(Environment.NewLine, table.Select().Select(x => "[" + 
string.Join(", ", x.ItemArray) + "]"));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...