如何将带多条件左连接与NVL的SQL转换为C# LINQ?
将指定SQL转换为C# 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'由于保护级别无法访问”的错误
正确的LINQ实现
var result = from a in tbl1 join c in tbl2 on new { Col4 = a.col4 ?? "", Col5 = a.col5 ?? "", Col6 = a.col6 ?? "" } equals new { Col4 = c.col4 ?? a.col4 ?? "", Col5 = c.col5 ?? a.col5 ?? "", Col6 = c.col6 ?? a.col6 ?? "" } into joinedGroup from c in joinedGroup.DefaultIfEmpty() // 按COL1分组,计算MAX(COL2) group new { a, c } by a.col1 into grouped let maxCol2 = grouped.Max(item => item.c?.col2 ?? 0) // 过滤COL2不等于0的结果 where maxCol2 != 0 select new { Col1 = grouped.Key, Col2 = maxCol2 };
错误原因及说明
- 拼写错误:你代码里的
tbl2on是笔误,应该写成tbl2 on,这是导致初始编译错误的直接原因之一。 - 括号冗余:
c.col4 ?? (a.col4 ?? "")中的括号可以移除,因为??是右结合运算符,简化为c.col4 ?? a.col4 ?? ""即可。 - 访问权限问题:“'a'由于保护级别无法访问”通常是因为
tbl1实体类的col4、col5等属性的访问修饰符不是public,检查实体类定义,确保这些属性是公开可访问的。 - 逻辑完整性:原SQL包含分组取最大值和过滤步骤,你的尝试代码缺少分组和过滤逻辑,上面的实现完整还原了原SQL的业务逻辑。
内容的提问来源于stack exchange,提问作者alinz
相关产品推荐
相关产品推荐

