0

DELETE FROM TABLE WHERE ID NOT IN (1,2,3) AND PAGEID = 9 のようなことをしたい

IDS のリストがありますが、必要に応じて変更できます。LINQ パーサーのブール値を取得する方法がわかりません。

これがSubsonicが期待するものです。

db.Delete(コンテンツ => コンテンツ.PageID == ID).Execute();

NOT IN ステートメントの実行方法がわかりません。List.Contains メソッドを試しましたが、何かが正しくありません。

更新: 1 つの代替方法は次のとおりです。

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

ただし、これはデータベースにさらに多くヒットします

4

3 に答える 3

2

「何かがおかしい」と言うとき、正確には何を意味するのですか?

私は書くことを期待します:

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

Contains候補ではなく、除外された値の配列を呼び出す必要があることに注意してください。つまり、「アイテムがコレクションにない」と言う代わりに、「コレクションにアイテムが含まれていない」と言っているのです。

于 2009-07-16T09:35:49.923 に答える
0

試してみてください。

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

(上記は単なる例であり、特定の状況ではいくつかの研磨が必要になる場合があります)

于 2009-07-16T09:31:05.440 に答える
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);
        }

これはデータベースへの 1 回のヒットで機能すると思いますが、QueryVisitor::VisitUnary で例外がスローされます。

WebPageContent.Delete(x => !usedID.Any(e => e == x.ID));
于 2009-07-17T10:49:01.040 に答える