c# - 左连接两个具有特定参数的数据表

标签 c# sql linq

我有两个数据表 t1t2。将它们导入 SQL,使用 SQL 命令 LEFT JOIN 进行测试,它正在运行。但是,由于数据量不是很大,我想知道是否可以直接对数据表执行相同的操作而不将它们导出到 SQL?

这里我在 SQL LFI = t1LSE = 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));

如何直接对数据表执行相同的操作,以便使用 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

最佳答案

这里你需要的是Full Outer Join in Sql。但是因为它在 Linq 中没有直接的等价物,所以你应该这样实现它:T1 ⋃ (T2 - T1)

T1 :通过T1 Left Join T2

实现

(T2 - T1) :通过T2 Left Join T1 Where T1 is null实现p>

这应该是您要查找的结果:

// 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}"
        );
}

关于c# - 左连接两个具有特定参数的数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62040606/

相关文章:

c# - 使用泛型对象的反射获取属性

java - 将正则表达式转换为 Oracle 数据库正则表达式

linq - Nhibernate Fetch/FetchMany/ThenFetch 重复结果

linq - 计算假期

c# - 在 Entity Framework 中选择作为子查询接收的列的不同计数和总和

c# - 实现 Win32 消息循环并使用 P/Invoke 创建 Window 对象

c# - 你如何使用C#从pdf文件中提取图像

c# - 在 .NET 中有什么比 SqlDataReader 更快的吗?

php - 向表中插入数据时出错

c# - 错误 "Extension method must be static"是什么意思?