Проверьте наличие несуществующих строк в LINQ to SQL - PullRequest
0 голосов
/ 26 января 2012

Мне нужен способ определить, какие строки были удалены из БД, учитывая список идентификаторов, представляющих интерес.Что-то вроде:

var idsOfInterest = new int[] {1,2,3,4};
idsOfInterest.Except(Datacontext.Table.Select(tbl=>tbl.ID)).Dump();

Как я могу это сделать?Какой оптимальный запрос LINQ для него?

РЕДАКТИРОВАТЬ: возможно ли сделать это за один шаг (один запрос к БД), не запрашивая существующие идентификаторы и затем применяя Except?

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Ваш собственный код подойдет. Однако может возникнуть проблема с производительностью, так как вы извлекаете все идентификаторы из базы данных, поэтому следующее более эффективно.

var idsInDatabase =
    from t in DataContext.Table
    where idsOfInterest.Contains(t.ID)
    select t.ID;

var idsDeletes = idsOfInterest.Except(idsInDatabase);

UPDATE:

Из вашего обновления, как я понимаю, вы хотели бы получить все недостающие идентификаторы из базы данных, что довольно сложно сделать, поскольку вы хотите, чтобы идентификаторы, которых больше не существует, из базы данных.

Если вы попытаетесь сделать это с простым старым SQL, вам понадобится либо таблица, содержащая большой список чисел {0, 1, 2, 3, ...} для объединения (так как ваш Table больше не содержит все идентификаторы) или вы бы создали внутренний запрос или табличную функцию). Это может выглядеть так:

SELECT  x.id
FROM    (
            SELECT    1 as id
            UNION ALL
            SELECT    2
            UNION ALL
            SELECT    3
            UNION ALL
            SELECT    3) x
        LEFT OUTER JOIN Table t ON x.id = t.ID
WHERE   t.ID IS NULL

Насколько я знаю, нет способа перевести такую ​​конструкцию в LINQ to SQL. То же самое верно для табличных функций.

Итак, что вы можете сделать, это присоединиться к вашему Table с каким-то Numbers столом, но лично я бы не стал этого делать, поскольку вы просто слишком усложняете вещи.

0 голосов
/ 26 января 2012

Как насчет этого?

        var idsOfInterest = new int[] {1,2,3,4 };

        var table = new int[] {2,3};


        var deletedIDs = from id in idsOfInterest
                         join t in table
                         on id equals t into gj
                         where !gj.Contains(id)
                         select id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...