C# linq left join 操作表和datatable
https://blog.csdn.net/The_flying_pig/article/details/79568072
操作表:
現有sfcusn表,sfcmo表,為保證sfcusn表數據的完整使用left join 查詢。結構如下

sql語句
-
---oracle寫法
-
SELECT A.usn,A.mo,A.upn,A.stage,B.line
FROM sfcusn A,sfcmo B
WHERE A.mo = B.mo(+)
linq語句
-
var query=
from A
in db.sfcusn
-
join B
in db.sfcmo
on A.mo
equals B.mo
into temp
-
from t
in temp.DefaultIfEmpty()
-
select
new
-
{
-
usn = A.usn,
-
mo = A.mo,
-
upn = A.upn,
-
stage = A.stage,
-
line = t==
null?
"":t.line
//判斷第二集合中可能為空
-
};
操作datatable:
現需對兩個datatable進行left join查詢,結構如下

這里需要用到A,B中三個欄位。
如果是查詢表用sql寫當然是很簡單了,可以仿看上面的sql寫出來。
linq在操作datatable,注意字段的類型。
-
var query =
from aa
in A.AsEnumerable()
-
join bb
in B.AsEnumerable()
-
on
new { USERID = aa.Field<
string>(
"USERID"), TRNDATE = aa.Field<
string>(
"TRNDATE"), MODEC = aa.Field<
string>(
"MODEC") }
-
equals
new { USERID = bb.Field<
string>(
"USERID"), TRNDATE = bb.Field<
string>(
"TRNDATE"), MODEC = bb.Field<
string>(
"MODEC") }
-
into temp
-
from tt
in temp.DefaultIfEmpty()
-
select
new
-
{
-
USERID = aa.Field<
string>(
"USERID"),
-
TOTAL = tt ==
null ?
0 : tt.Field<
decimal>(
"TOTAL"),
-
ECOUNT = aa.Field<
decimal>(
"ECOUNT") ==
null ?
0 : aa.Field<
decimal>(
"ECOUNT"),
-
RATE = (
100 * (tt ==
null ?
1 : (tt.Field<
decimal>(
"TOTAL") ==
0 ?
1 : aa.Field<
decimal>(
"ECOUNT") / tt.Field<
decimal>(
"TOTAL")))).ToString(
"#0.00") +
"%",
-
TRNDATE = a.Field<
string>(
"TRNDATE") ==
null ?
"" : a.Field<
string>(
"TRNDATE"),
-
MODEC = aa.Field<
string>(
"MODEC") ==
null ?
"" : aa.Field<
string>(
"MODEC")
-
};
最后希望對大家有幫助謝謝!
