【问题标题】:Delete operation using linq使用 linq 进行删除操作
【发布时间】:2012-02-16 11:57:01
【问题描述】:

当我使用 'var select = from st in context.student 其中 st.college=="ABC" 选择 st;'

context.student.DeleteAllonSubmit(select); context.student.SubmitChanges();

如果有 10 条记录包含大学名称为“ABC”,则触发 10 条删除查询。

【问题讨论】:

  • 但触发选择查询的确切原因仍未清除。我们如何避免使用 Linq 在更新和删除查询中选择语句
  • 我认为因为正如答案所说 - LINQ 和 LINQ to SQL 具有基于集合的更新功能。第二个“答案”给出了解决办法。但是看看有没有其他人有什么要补充的。我会感兴趣
  • 它可以进行更新,但是当我使用以下查询进行删除操作时,也会触发选择查询。 var delet= from remov in context.student where remov.college=="ABC" select remov; context.student.DeleteAllonSubmit(delet); context.SubmitChanges();

标签: c# linq


【解决方案1】:

好吧,我唯一的解释是 Linq 首先必须选择要更新/删除的行。在它知道哪些行受到更新/删除影响后,Linq 会进行最充分的查询来更新/删除您想要的行并执行它。

如果我错了,请纠正我,这就是我认为正在发生的事情,我不确定。

【讨论】:

  • 那么实际发生的情况如下。当您创建对象时,实体框架使用您的 edmx 文件(或其他处理从数据库到对象的转换的文件)从数据库中生成对象。这些对象与您的数据库不同步。因此,当您从对象上下文中删除/更新对象并说要保存对象上下文时,实体框架会将您的对象与您拥有的数据库中的对象(也使用 edmx(或其他)文件)进行比较。然后实体框架根据您的更改更新数据库(使用最佳查询)。
  • 很高兴为您提供帮助(不要忘记投票 :))。我的建议是打开您的对象上下文,执行单个 Linq 查询,删除您要删除的所有行。然后保存更改并关闭您的对象上下文(您应该使用 using 语句,但这是另一回事)。 Linq 应该很聪明,它可以在单个查询中检测到它是可能的。你这样做了,Linq 几乎可以做同样的事情。那么您所要做的就是相信 Linq icm 实体框架会执行正确的查询。您还可以在我相信的 SQL Server 2008 中监视发送查询。
  • 您可以发布您正在执行的 Linq 查询吗?也许弄清楚这 10 个查询到底是什么?表扫描表搜索等
  • 试试这样的。使用 (var oc = new ObjectContextName()) { var sel = oc.students.Where(x => x.college == "XYZ").ToList(); foreach (var item in sel) { oc.DeleteObject(item); } oc.SaveChanges(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多