Слева соедините две таблицы данных с определенными параметрами - PullRequest
4 голосов
/ 27 мая 2020

У меня есть две таблицы данных t1 и t2. Импортировал их в SQL, протестировал SQL командой LEFT JOIN, и он работает. Однако, поскольку объем данных не так велик, мне интересно, можно ли выполнить то же действие непосредственно с таблицами данных без их экспорта в SQL?

Здесь у меня есть две таблицы в SQL LFI = t1 и LSE = t2.

Таблица LFI в базе данных:

NRO   SNAME  NAMEA   NAMEB   IADDRESS  POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   BID
123   Fiat   Punto   500     J5        K4      O3      P4        O2         JT        S1
133   Opel   Meriva  FTG     J5        K4      O3      P4        O2         JO        T3
153   MB     E200    C25     JN        KI      OP      PY        OR         JD        Y5
183   BMW    E64     SE0     JR        KE      OT      PG        OL         J8        U9 
103   Audi   S6      700     JP        KU      OU      PN        OH         J6        I11

Таблица LSE в базе данных:

NRO   SNAME  NAMEA   NAMEB   IADDRESS  POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   BID
423   Fiat   Punto   500     J5        K4      O3      P4        O2         JT        S1
463   BMW    E64     SE0     JR        KE      OT      PG        OL         J8        U9
483   KIA    E89     S78     J7        K7      O9      P6        O5         J4        U6

Код ниже может делать то, что ожидается:

SELECT *
FROM LFI
LEFT JOIN LSE 
ON CAST(LFI.SNAME AS VARCHAR(50)) = CAST(LSE.SNAME AS VARCHAR(50));

Как выполнить то же самое непосредственно с таблицами данных, чтобы объединенный результат был от go до temporary с LEFT JOIN?


Текущий код:

                var results = from table1 in t1.AsEnumerable()
                              join table2 in t2.AsEnumerable() 
                              on (string)table1["SNAME"] equals (string)table2["SNAME"]
                              //into temp
                              //from row in temp.DefaultIfEmpty()
                              select new
                              {
                                  NRO = (string)table1["NRO"],
                                  SNAME = (string)table1["SNAME"],
                                  NAMEA = (string)table1["NAMEA"],
                                  NAMEB = (string)table1["NAMEB"],
                                  ADDRESS = (string)table1["ADDRESS"],
                                  POSTA = (string)table1["POSTA"],
                                  POSTN = (string)table1["POSTN"],
                                  POSTITP = (string)table1["POSTITP"],
                                  COMPANYN = (string)table1["COMPANYN"],
                                  COUNTRY = (string)table1["COUNTRY"],
                                  BID = (string)table1["BID"]
                              };

                foreach (var item in results)
                {
                    Console.WriteLine(String.Format("NRO = {0}, SNAME = {1}, NAMEA = {2}, NAMEB = {3}, KAYNTIOS = {4}, ADDRESS = {5}, POSTA = {6}, POSTN = {7}, COMPANYN = {8}, COUNTRY = {9}, BID = {10}", item.NRO, item.SNAME, 
                        item.NAMEA, item.NAMEB, item.KAYNTIOS, item.ADDRESS, item.POSTA, item.POSTN, item.COMPANYN, 
                        item.COUNTRY, item.BID));
                }

Мой текущий код выводит только совпадающие результаты:

NRO  SNAME  NAMEA   NAMEB   IADDRESS  POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   BID
123  Fiat   Punto   500     J5        K4      O3      P4        O2         JT        S1
183  BMW    E64     SE0     JR        KE      OT      PG        OL         J8        U9

Объединенный вывод должен выглядеть следующим образом (порядок столбцов на самом деле не имеет значения, если он все время один и тот же):

NRO  NRO1   SNAME  NAMEA   NAMEB   IADDRESS  POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   BID
123  423    Fiat   Punto   500     J5        K4      O3      P4        O2         JT        S1
133         Opel   Meriva  FTG     J5        K4      O3      P4        O2         JO        T3
153         MB     E200    C25     JN        KI      OP      PY        OR         JD        Y5
183  463    BMW    E64     SE0     JR        KE      OT      PG        OL         J8        U9
103         Audi   S6      700     JP        KU      OU      PN        OH         J6        I11
     483    KIA    E89     S78     J7        K7      O9      P6        O5         J4        U6

1 Ответ

3 голосов
/ 29 мая 2020

Здесь вам понадобится Full Outer Join в Sql. Но поскольку у него нет прямого эквивалента в Linq, вы должны реализовать его следующим образом: T1 ⋃ ( T2 - T1 )

T1 : достигается T1 Left Join T2

( T2 - T1 ): достигается T2 Left Join T1 Где T1 - ноль

Это должно привести к тому, что вы ищете:

// T1
var firstPart = from table1 in t1.AsEnumerable()
                join table2 in t2.AsEnumerable()
                    on (string)table1["SNAME"] equals (string)table2["SNAME"] into temp
                from table2 in temp.DefaultIfEmpty()
                select new
                {
                    NRO = (string)table1["NRO"],
                    NRO1 = table2 != null ? (string)table2["NRO"] : string.Empty,
                    SNAME = (string)table1["SNAME"],
                    NAMEA = (string)table1["NAMEA"],
                    NAMEB = (string)table1["NAMEB"],
                    ADDRESS = (string)table1["ADDRESS"],
                    POSTA = (string)table1["POSTA"],
                    POSTN = (string)table1["POSTN"],
                    POSTITP = (string)table1["POSTITP"],
                    COMPANYN = (string)table1["COMPANYN"],
                    COUNTRY = (string)table1["COUNTRY"],
                    BID = (string)table1["BID"]
                };

// (T2 -T1)
var secndPart = from table2 in t2.AsEnumerable()
                join table1 in t1.AsEnumerable()
                    on (string)table2["SNAME"] equals (string)table1["SNAME"] into temp
                from table1 in temp.DefaultIfEmpty()
                where table1 == null
                select new
                {
                    NRO = string.Empty,
                    NRO1 = (string)table2["NRO"],
                    SNAME = (string)table2["SNAME"],
                    NAMEA = (string)table2["NAMEA"],
                    NAMEB = (string)table2["NAMEB"],
                    ADDRESS = (string)table2["ADDRESS"],
                    POSTA = (string)table2["POSTA"],
                    POSTN = (string)table2["POSTN"],
                    POSTITP = (string)table2["POSTITP"],
                    COMPANYN = (string)table2["COMPANYN"],
                    COUNTRY = (string)table2["COUNTRY"],
                    BID = (string)table2["BID"]
                };

// T1 ⋃ (T2 - T1)
var results = firstPart.Concat(secndPart);

foreach (var item in results)
{
    Console.WriteLine(
        $"NRO = {item.NRO}, " +
        $"NRO1 = {item.NRO1}, " +
        $"SNAME = {item.SNAME}, " +
        $"NAMEA = {item.NAMEA}, " +
        $"NAMEB = {item.NAMEB}, " +
        $"ADDRESS = {item.ADDRESS}, " +
        $"POSTA = {item.POSTA}, " +
        $"POSTN = {item.POSTN}, " +
        $"POSTITP = {item.POSTITP}, " +
        $"COMPANYN = {item.COMPANYN}, " +
        $"COUNTRY = {item.COUNTRY}, " +
        $"BID = {item.BID}"
        );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...