【发布时间】:2021-12-21 16:19:39
【问题描述】:
我有一个三表关键字结构
团队 关键字
中间表是联结表(连接表)。
我想从关键字中删除可能的孤儿(未在 TeamKeyword 中使用)。
我的第一次尝试是这样直观的:
var orphans = db.From<Keyword>().LeftJoin<TeamKeyword>().Where<TeamKeyword>(tk => tk == null);
db.Delete(orphans);
创建了这个不起作用的 SQL(在 Sqlite 中):
DELETE FROM "Keyword" WHERE "Keyword"."Id" IN (SELECT "Keyword"."Id"
FROM "Keyword" LEFT JOIN "TeamKeyword" ON
("Keyword"."Id" = "TeamKeyword"."KeywordId")
WHERE ('{}' is null))
我知道它可以像这样用手写 SQL 来完成:
DELETE FROM Keyword
WHERE Id IN (
SELECT k.Id
FROM Keyword k
LEFT JOIN TeamKeyword tk on tk.KeywordId = k.Id
WHERE tk.Id IS NULL
)
所以我通过使用表别名(需要引用表)和一些原始 SQL 使其工作,但有没有更简单的方法?这是一个很常见的用例。
var orphans = db.From<Keyword>().LeftJoin<TeamKeyword>((k,tk)=>tk.KeywordId==k.Id, db.TableAlias("tk")).Where("tk.Id IS NULL");
db.Delete(orphans);
【问题讨论】: