检查LINQ to SQL中是否存在不存在的行

本文关键字:存在 不存在 是否 LINQ to SQL 检查 | 更新日期: 2023-09-27 18:21:33

我需要一种方法来确定从DB中删除了哪些行,给定一个感兴趣的ID列表。类似于:

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

我该怎么做?它的最佳LINQ查询是什么?

编辑:是否可以一步完成(单个DB查询),而不查询现有ID,然后应用Except?

检查LINQ to SQL中是否存在不存在的行

您自己的代码会做得很好。但是,由于要从数据库中提取所有ID,因此可能会出现性能问题,因此以下操作更有效。

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

更新:

据我所知,根据您的更新,您希望从数据库中检索所有丢失的ID,这很难做到,因为您想要从数据库中不再存在的ID。

如果您尝试使用普通的旧SQL来执行此操作,则需要一个包含大量数字{0,1,2,3,…}的表来联接(因为Table不再包含所有ID),或者创建一个内部查询或表值函数)。看起来可能是这样的:

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到SQL。表值函数也是如此。

所以你可以用某种Numbers表来连接你的Table,但我个人不会这么做,因为你只是把事情复杂化了。

怎么样?

        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;