我在将具有多个 LEFT OUTER JOIN
的 Oracle Sql 查询转换为 LINQ 时遇到问题。我的尝试没有返回预期的结果。有人可以帮助将下面的 SQL 查询转换为 LINQ。
string currentCulture = Culture.GetCulture();
string query = @"SELECT *
FROM CTGLBL g, CTTGLBL ct, CTLANG lang
WHERE g.sysctglbl = ct.sysctglbl(+) AND
ct.sysctlang = lang.sysctlang (+) AND
NVL(lang.activeflag, 1)= 1 AND
(ISOCODE LIKE '" + currentCulture + "%' OR ISOCODE IS NULL)";
ISOCODE 属于 CTLANG 表。
附言。我不会使用 LINQPAD 或 Linqer 等工具。
最佳答案
但是对于你的 sql(这里转换为 linq)更好的做法是使用 join
来连接表而不是 where
:
string currentCulture = Culture.GetCulture();
var result = from g in CTGLBL
join ct in CTTGLBL on g.sysctglbl equals ct.sysctglbl into ctj
from ct in ctj.DefaultIfEmpty()
join lang in CTLANG on ct.sysctlang equals lang.sysctlang into langj
from lang in langj.DefaultIfEmpty()
where (lang == null ? 1 : (lang.activeflag ?? 1)) == 1 &&
(lang?.ISOCODE.StartsWith(currentCulture) || lang?.ISOCODE == null)
select new { g, ct, lang };
您还可以为您的 CTLANG
设置一个“嵌套选择”
,如下所示:
string currentCulture = Culture.GetCulture();
var result = from g in CTGLBL
join ct in CTTGLBL on g.sysctglbl equals ct.sysctglbl into ctj
from ct in ctj.DefaultIfEmpty()
join lang in CTTGLBL.Where(lang => lang.activeflag ?? 1 == 1 &&
(lang.ISOCODE.Contains(currentCulture) ||
lang.ISOCODE == null))
on ct.sysctlang equals lang.sysctlang into langj
from lang in langj.DefaultIfEmpty()
select new { g, ct, lang };
关于c# - 将 SQL(左外连接)转换为 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38914184/