gpt4 book ai didi

c# - 将 SQL(左外连接)转换为 LINQ

转载 作者:太空宇宙 更新时间:2023-11-03 21:09:07 25 4
gpt4 key购买 nike

我在将具有多个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com