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

标签 c# sql oracle linq

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

相关文章:

c# - Azure 服务总线未检测到重复项

php - MySQL 中的 SQL 查询 PHP

mysql - 基于特定条件的内连接

sql - oracle中count(1)和count(*)的区别

c# - WPF 绑定(bind) TabControl TabItem

c# - 将 GeoJSON 响应转换为 FeatureCollection

c# - 如何让 XmlRoot 拥有对象集合?

sql - 根据生成的结果过滤 SQL 查询

database - OALL8 在 Oracle Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production 中处于不一致状态

c++ - 为什么我的 Redhat 服务器上的 QuickFIX 进程没有将它的核心文件写到它应该写的地方?