如何使用LINQ-TO-SQL基于非主键字段项的集合删除多行?

时间:2009-07-10 19:22:26

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

我有这些专栏,

id int primary key,
code int not null

我想删除代码等于a,

中某个项目的所有项目
IEnumerable<int> someEnumerable

一种可能的方法是使用迭代。但我想在没有明确迭代的情况下做到这一点(for,foreach)。另一种方法是这样做:

var result = db.table.Where(a => someEnumerable.Contains(a.code));
db.table.DeleteAllOnSubmit(result);
db.SubmitChanges();

但对我来说,它会导致:

  

System.Data.Linq.dll中出现未处理的“System.StackOverflowException”类型异常

2 个答案:

答案 0 :(得分:1)

如前所述here它是由Linq错误导致的,在.NET 4.0上已得到纠正

  

包含现在检测自引用IQueryable并且不会导致堆栈溢出

来自SO的某个地方:

  

在.NET 3.5中解决问题:当使用“Auto Generated Value”= True时,必须将“Delay Loaded”设置为False - 否则会出现递归错误。

答案 1 :(得分:0)

在我看来,你所拥有的代码应该起作用。您可能希望尝试缩小异常是来自实体的选择还是实际删除。尝试向查询添加ToList(),这将强制它运行选择逻辑,然后查看在选择期间或删除时是否抛出异常。