通过LINQ / Subsonic重现“DELETE NOT IN”SQL语句

时间:2009-07-16 09:25:02

标签: linq subsonic subsonic3

我想做一些像DELETE FROM TABLE WHERE ID NOT IN(1,2,3)和PAGEID = 9

我有一份IDS列表但如果需要可以更改。我无法弄清楚如何获得LINQ解析器的布尔结果。

这是亚力克希望我的想法。

db.Delete(content => content.PageID == ID).Execute();

我无法弄清楚如何进行NOT IN语句。我已经尝试过List.Contains方法但不太正确。

更新:另一种方法是:

var items = TABLE.Find(x => x.PageID == ID)'
foreach(var item in items)
{
   item.Delete();
}

虽然

,但这对数据库的影响要大得多

3 个答案:

答案 0 :(得分:2)

当你说“不太正确”的时候,你究竟是什么意思?

我希望写一下:

List<int> excluded = new List<int> { 1, 2, 3 };
db.Delete(content => !excluded.Contains(content.PageID)).Execute();

请注意,您需要在排除值数组上调用Contains,而不是候选人。换句话说,不是说“不在收集中的项目”,而是说“收集不包含项目。”

答案 1 :(得分:0)

试试.Contains:

db.Delete(content => content.PageID.Contains(<Array containing ID's>).Execute();

(以上只是一个例子,可能需要根据您的具体情况进行一些抛光)

答案 2 :(得分:0)

我发现这可行,但不是通过LINQ

var table = new WebPageContentTable(_db.DataProvider);
var g = new SubSonic.Query.Delete<WebPageContent(_db.DataProvider)
            .From(table)
            .Where(table.ID)
            .NotIn(usedID)
            .Execute();

我发现这确实有效并且通过LINQ - 然而它会多次击中数据库。

        var f = WebPageContent.Find(x => !usedID.Any(e => e == x.ID));
        if (f.Count > 0)
        {
            var repo = WebPageContent.GetRepo();
            repo.Delete(f);
        }

我想这可以在一次点击数据库中工作,但我在QueryVisitor :: VisitUnary中抛出一个异常

WebPageContent.Delete(x => !usedID.Any(e => e == x.ID));