C# 检查LINQ to SQL中是否存在不存在的行
我需要一种方法来确定在给定感兴趣的id列表的情况下从DB中删除了哪些行。 比如: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?您自己的代码就可以了。但是,可能存在性能问题,因为您要从数据库中
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-一步我指的是一个数据库查询。