Entity framework 4 Linq到实体:如何有效地将记录从一个表复制到另一个表?

Entity framework 4 Linq到实体:如何有效地将记录从一个表复制到另一个表?,entity-framework-4,linq-to-entities,Entity Framework 4,Linq To Entities,我们有一个按日期和时间组织数据的事件系统。我们经常将数据从旧事件复制到新事件作为启动程序,然后对其进行修改 这就是我们在Linq所做的: 使用.ToList()在本地获取源对象 为每个项目创建一个新对象 将非主键值复制到新对象并设置新主键 将该对象添加到表中 这会生成大量的数据库调用。它至少包装在一个事务中 这是SQL中的语句。有什么方法可以使Linq在不嵌入SQL的情况下变得如此高效 insert into targetTable (eventID, two, three, four fi

我们有一个按日期和时间组织数据的事件系统。我们经常将数据从旧事件复制到新事件作为启动程序,然后对其进行修改

这就是我们在Linq所做的:

  • 使用.ToList()在本地获取源对象
  • 为每个项目创建一个新对象
  • 将非主键值复制到新对象并设置新主键
  • 将该对象添加到表中
这会生成大量的数据库调用。它至少包装在一个事务中

这是SQL中的语句。有什么方法可以使Linq在不嵌入SQL的情况下变得如此高效

insert into targetTable (eventID, two, three, four five)
select @newEventId as eventID, two, three, four, five
from   targetTable 
where  eventid = @eventid

为了保持高效,您需要将SQL放入存储过程中,然后将该存储过程添加到实体数据模型中。

不,您无法提高EF代码的效率。这就是EF的工作原理。若您想将SQL高效地包装到存储过程中,请在EF designer中映射存储过程并调用该SP

如果不能创建存储过程,则直接执行SQL。您可以使用:

ObjectContext.ExecuteStoreCommand(...)

此方法仅在EF4中可用。

这不是问题,但我们的客户不允许我们更改他们的模式。在您需要创建存储过程之前,这不是问题。@Zim博士:我添加了一些替代方法。这不太好,但是如果你想提高效率,那么直接调用SQL就没有更好的选择了。好主意,但是我们的客户不允许我们修改底层数据库。哦,这应该包括在问题中。您可能现在只需要嵌入SQL,然后推送某人(可能是实际拥有权限的DBA)稍后将存储的过程添加到数据库中以实现可维护性。