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