LINQ - 具有多个条件和 Is Null 运算符的左连接

问题描述 投票:0回答:1

我想在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?

c# linq join
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.