linq2Entities 下的多个操作

Posted

技术标签:

【中文标题】linq2Entities 下的多个操作【英文标题】:Multiple operations under linq2Entities 【发布时间】:2014-04-02 12:15:54 【问题描述】:

我在小规模程序上使用 Linq2Entities 已经有一段时间了。所以通常我的查询是基本的(返回特定列中具有特定值的元素,添加/更新元素,删除元素,...)。

现在我正在转向更大规模的程序,鉴于我使用 Linq2Entities 的经验,一切都很好,直到我不得不删除大量元素。

在 Linq2Entities 中,我只能找到一个删除实体的方法 - 因此,要删除 1000 个元素,我需要先检索它们,然后逐个应用删除,然后调用 savechanges。

要么我遗漏了一些东西,要么我觉得 a) 这在性能方面真的很糟糕 b) 我最好把它作为数据库中的一个过程。

我的假设是否正确?是否应该仅将大量移除/添加作为程序进行?或者有没有办法使用我缺少的 Linq2Entities 有效地做到这一点?

【问题讨论】:

阅读:***.com/questions/8649795/linq-to-entities-delete @haim770 - linq 并没有真正回答我的问题,因为它报告单个元素被删除,而我的问题报告给多个元素。尽管 OmegaMan 的回答虽然不是被接受的,但可以适用于我的场景。我的问题仍然是关于是否知道我是否可以使用 Linq2Entities 执行类似“从创建日期 【参考方案1】:

如果您有主键值,那么您可以通过手动创建对象、设置它们的键、将它们附加到上下文并将它们的状态设置为删除来使用上下文的其他功能。

 var ids = new List<Guid>();
            foreach (var id in ids)
            
                Employee employee = new Employee();
                employee.Id = id;
                entityEntry = context.Entry(employee);
                entityEntry.State = EntityState.Deleted;
            
            context.SaveChanges();

【讨论】:

有趣 - 不知道 context.Entry 或 EntityState - +1 用于教我一些新东西 - 但不会像 context.MyTableSet 那样导致对数据库的多个“删除”SQL 查询.删除(实体)? 另外 - 如果我不想通过 id 而是通过其他字段(更常见)删除怎么办?喜欢创建日期在 2010 年 1 月 1 日之前的条目?那时这行不通。拥有要删除的 id 列表并不常见,而是像在某个日期之前创建的规则或与不同表中的特定行有关系的规则 - 例如表发票和表 invoicelines,并且您想从发票中删除所有 invoicelines x 是的,EF 无法像您那样优化它。删除那么多记录时,我在数据库中执行此操作。任何批量的东西我都倾向于使用存储过程。 EF 不擅长处理大量记录,并且当上下文充满记录时,性能可能会成为一个真正的问题。 如果您想按日期删除,您必须先查询 id,然后将实体附加为已删除。 EF 不支持您的要求。如果您必须使用使用EF,那么您必须查询。您能做的最好的事情就是查询 id,这样记录的其余部分就不会通过网络发送并加载到上下文中。 context.SomeRecords.Where(x=>x.Date >= someDate).Select(x=>x.Id).ToList() 感谢您确认我对 Chow 框架限制的怀疑

以上是关于linq2Entities 下的多个操作的主要内容,如果未能解决你的问题,请参考以下文章

EntityClient 介绍

使用javax.mail包下的类实现发送邮件工具类

实体框架和经典 Ado.net 之间的单个事务或批量插入操作下的 SqlBulkCopy 多个表插入

使用 Symfony 自动装配时是不是可以排除多个目录?

PHP:convertir des retoursÃla ligne en entitÃhtml avec la fonction nl2br()

在多核CPU下,同一进程下的多个线程可以并行运行吗