【问题标题】:Delete orphans in Servicestack ORMLite with junction/join table使用联结/连接表删除 Servicestack ORMLite 中的孤儿
【发布时间】: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);

【问题讨论】:

    标签: ormlite-servicestack


    【解决方案1】:

    再次回答我自己的问题,因为我找到了方法。只需将 TeamKeyword 的 Id 设为 int? 即可(认为这行不通,因为它是主键,但实际上 DB 中的主键仍然不为空)。

    然后这个工作(创建我正在寻找的 SQL):

    var orphans = db.From<Keyword>().LeftJoin<TeamKeyword>().Where<TeamKeyword>(k => k.Id==null);
    db.Delete(orphans);
    

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 2013-06-05
      • 2012-08-16
      • 2011-02-09
      • 1970-01-01
      • 2011-01-02
      • 2012-10-22
      • 1970-01-01
      • 2012-02-07
      相关资源
      最近更新 更多