Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查LINQ to SQL中是否存在不存在的行_C#_.net_Linq_Linq To Sql - Fatal编程技术网

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

C# 检查LINQ to SQL中是否存在不存在的行,c#,.net,linq,linq-to-sql,C#,.net,Linq,Linq To Sql,我需要一种方法来确定在给定感兴趣的id列表的情况下从DB中删除了哪些行。 比如: var idsOfInterest = new int[] {1,2,3,4}; idsOfInterest.Except(Datacontext.Table.Select(tbl=>tbl.ID)).Dump(); 我该怎么做?什么是它的最佳LINQ查询 编辑:是否可以一步完成(单个数据库查询),而不查询现有ID,然后应用Exception?您自己的代码就可以了。但是,可能存在性能问题,因为您要从数据库中

我需要一种方法来确定在给定感兴趣的id列表的情况下从DB中删除了哪些行。 比如:

var idsOfInterest = new int[] {1,2,3,4};
idsOfInterest.Except(Datacontext.Table.Select(tbl=>tbl.ID)).Dump();
我该怎么做?什么是它的最佳LINQ查询


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

您自己的代码就可以了。但是,可能存在性能问题,因为您要从数据库中提取所有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,…}来进行连接(因为
不再包含所有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。表值函数也是如此

所以你能做的就是用一些数字加入你的
表,但我个人不会这么做,因为你把事情复杂化了。

这样做怎么样

        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;

@RoyDictus我补充了一个问题,谢谢!好的,这是一个可能的解决方案,但是可以一步完成吗?请参阅问题中的编辑。@jaraics-如果它是在一个步骤中,为什么它很重要?@Ramhound如果我有一个只返回我感兴趣的ID的查询,那将比检索列表中的ID更有效。。。如果可能的话。。。这就是问题所在now@jaraics:请为我定义“一步”。如果您指的是“一行代码”,那么这将不会更高效,甚至可读性更低,这实际上会降低效率,因为开发人员的生产率会降低(这比一些可能的CPU周期要高很多)。如果您的意思是“一步”完成数据库中除
部分之外的
;我认为这是可能的,但要做到这一点要困难得多,因为您希望从数据库返回不存在的ID。当然,这会导致很难理解的代码。@Steven-一步我指的是一个数据库查询。