【发布时间】:2018-02-04 16:24:54
【问题描述】:
使用Linq2db 和Ms 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