Воспроизвести оператор SQL «DELETE NOT IN» через LINQ / Subsonic - PullRequest
0 голосов
/ 16 июля 2009

Я хочу сделать что-то вроде УДАЛИТЬ ИЗ ТАБЛИЦЫ, ГДЕ НЕ ВХОДИТ (1,2,3) И PAGEID = 9

У меня есть список IDS, но он может быть изменен в случае необходимости. Я не могу понять, как получить логический результат для синтаксического анализатора LINQ.

Вот что ожидает Subsonic, я думаю.

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 ]

2 голосов
/ 16 июля 2009

Когда вы говорите «что-то не совсем правильно», что именно вы имеете в виду?

Я ожидал бы написать:

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

Обратите внимание, что вам нужно вызывать Contains для массива исключенных значений, а не для вашего кандидата. Другими словами, вместо «элемент не в коллекции» вы говорите: «коллекция не содержит элемент».

0 голосов
/ 17 июля 2009

Я обнаружил, что это работает, но не через 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));
0 голосов
/ 16 июля 2009

Попробуйте. Содержит:

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

(выше приведен только пример, может потребоваться некоторая полировка для вашей конкретной ситуации)

...