【问题标题】:Linq left outer join with exclusion via Linq2db通过 Linq2db 排除 Linq 左外连接
【发布时间】:2018-02-04 16:24:54
【问题描述】:

使用Linq2dbMs Access 我想选择所有没有目标的扇区,因此我想执行带排除的左外连接:

Dim q10 = From s In db.Sectors
          From t In db.Targets.Where(Function(f) f.id_sector = s.Id).DefaultIfEmpty
          Where t Is Nothing
          Select s

Linq2db 将其解析为:

--  Access
SELECT
    [t2].[Id],
    [t2].[Name]
FROM
    [tblSector] [t2]
        LEFT JOIN [tblTarget] [t1] ON ([t1].[id_sector] = [t2].[Id])
WHERE
    [t1].* IS NULL <=========== HERE

这显然是错误的。

我也试过了:

Dim q10 = From s In db.Sectors
          From t In db.Targets.Where(Function(f) f.id_sector = s.Id And f Is Nothing).DefaultIfEmpty
          Select s

接收:

--  Access
SELECT
    [t2].[Id],
    [t2].[Name]
FROM
    [tblSector] [t2]
        LEFT JOIN [tblTarget] [t1] ON ([t1].[id_sector] = [t2].[Id] AND [t1].* IS NULL) <=========== HERE

总结一下,我需要:

SELECT
    [t2].[Id],
    [t2].[Name]
FROM
    [tblSector] [t2]
        LEFT JOIN [tblTarget] [t1] ON ([t1].[id_sector] = [t2].[Id])
WHERE
    [t1].[id_sector] IS NULL

如何在Where t1.id_sector Is Nothing条件下写(id_sector是FK所以它是Integer所以它不能是Nothing

【问题讨论】:

  • 也许你真的需要 RIGHT JOIN。不管它叫什么,你可能需要“来自 Sector 的所有记录,只有来自 Target 的那些匹配”。
  • 我不确定第一个选项和您需要的选项有什么区别 - 如果 id_sector 为 null 则整个 raw 为 null,因此两个查询之间没有实际区别
  • @gilmishal 没错。没有不同。问题是Linq2db 无法将正确的 linq 查询解析为 SQL 查询。所以我的问题是如何在linq2db 中编写 linq 查询以达到上一个 SQL 示例中的结果。

标签: vb.net linq ms-access linq2db


【解决方案1】:

我找到了答案。这是一个小解决方法,但它有效。

因为这个查询在linq2db中不起作用:

Dim q10 = From s In db.Sectors
          From t In db.Targets.Where(Function(f) f.id_sector = s.Id).DefaultIfEmpty
          Where t Is Nothing
          Select s

我们可以这样写:

Dim q10 = From s In db.Sectors 
          Where Not (From t In db.Targets Select t.id_sector).Contains(s.Id)
          Select s

但是生成的 SQL 看起来像这样:

SELECT
    [t2].[Id],
    [t2].[Name]
FROM
    [tblSector] [t2]
        LEFT JOIN [tblTarget] [t1] ON ([t1].[id_sector] = [t2].[Id])
WHERE
    [t1].[id_sector] IS NULL

看起来像这样:

SELECT
    [t2].[Id],
    [t2].[Name]
FROM
    [tblSector] [t2]
WHERE
    NOT (EXISTS(
        SELECT
            *
        FROM
            [tblTarget] [t1]
        WHERE
            [t1].[id_sector] = [t2].[Id]
    ))

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2011-08-04
    相关资源
    最近更新 更多