检查LINQ to SQL中的非现有行

时间:2012-01-26 11:01:30

标签: c# .net linq linq-to-sql

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

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

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

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

2 个答案:

答案 0 :(得分:2)

你自己的代码会好起来的。但是,由于您从数据库中提取所有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,...}的表来加入(因为您的{{1 }}不再包含所有ID)或者您将创建内部查询或表值函数)。这可能是这样的:

Table

据我所知,没有办法将这样的构造转换为LINQ to SQL。表值函数也是如此。

所以你可以做的就是加入你的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 某种Table表格,但我个人不会这样做,因为你只是过于复杂化了。

答案 1 :(得分:0)

怎么回事呢?

        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;