我想在linq中编写以下sql。
SELECT COL1, COL2
FROM ( SELECT A.COL1, MAX (NVL (C.COL2, 0)) COL2
FROM TBL1 A
LEFT JOIN TBL2 C
ON NVL (A.COL4, '') = NVL (C.COL4, NVL (A.COL4, ''))
AND NVL (A.COL5, '') = NVL (C.COL5, NVL (A.COL5, ''))
AND NVL (A.COL6, '') = NVL (C.COL6,NVL (A.COL6, ''))
GROUP BY A.COL1)
WHERE COL2 <> 0
我尝试这样写;
var aa = from a in tbl1
join c in tbl2on a.col4 ?? "" equals c.col4 ?? (a.col4 ?? "") into ps_jointable
from p in ps_jointable.DefaultIfEmpty()
select new { .. }
我在第一个条件中收到“括号可以删除”错误。删除括号后,我得到 'a' 由于其保护级别而无法访问
如何用 C# 编写这个 sql linq?
Linq 不支持非等连接,也不支持任何使用
equals
一侧的左右列的等连接。
您需要使用单独的
from
子句。
var aa =
from a in tbl1
from c1 in tbl2.Where(c =>
a.Col4 ?? "" == c.Col4 ?? (a.Col4 ?? "") &&
a.Col5 ?? "" == c.Col5 ?? (a.Col5 ?? "") &&
a.Col6 ?? "" == c.Col6 ?? (a.Col6 ?? "")
) into ps_jointable
from c in ps_jointable.DefaultIfEmpty()
group by a.Col1 into g
where g.Max(c.Col2 ?? 0) != 0
select new
{ ..
}
话虽如此,建议您改为执行适当的空相等谓词。
from c1 in tbl2.Where(c =>
(a.Col4 == null && b.Col4 == null || a.Col4 == c.Col4) &&
(a.Col5 == null && b.Col5 == null || a.Col5 == c.Col5) &&
(a.Col6 == null && b.Col6 == null || a.Col6 == c.Col6) &&
) into ps_jointable