建议在Entity Framework 4中使用临时表或表变量.更新性能实体框架

Lia*_*iam 11 c# temp-tables sql-server-2008 entity-framework-4

我需要更新表中的位字段,并将该字段设置为true,以获取该表中特定的Ids列表.

ID从外部进程传入.

我想在纯SQL中最有效的方法是创建一个临时表并用Ids填充它,然后用这个连接主表并相应地设置位字段.

我可以创建一个SPROC来获取Ids,但是可能涉及需要这个标志的200-300,000行,所以它可能不是最有效的方式.使用IN语句限制了可以传递的数据量和性能.

如何使用实体框架实现上述目标

我想可以创建一个SPROC来创建一个临时表,但从模型的角度来看这不存在.

有没有办法在运行时动态添加实体.[或者这种方法会引起头痛].

我正在做出上面的假设,虽然填充一个300,000行的临时表并且进行连接会比调用SPROC 300,000倍更快:) [Ids是Guids]

还有其他方法我应该考虑.

Mar*_*ell 16

对于300k行的数据量,我会忘记EF.我会通过如下表来做到这一点:

BatchId  RowId
Run Code Online (Sandbox Code Playgroud)

其中RowId是我们想要更新的行的PK,而BatchId只是引用300k行的这个"运行"(允许一次多个等).

我会生成一个新的BatchId(这可能是任何独特的-Guid跳出来的想法),并使用SqlBulkCopy将te记录插入此表,即

100034   17
100034   22
...
100034   134556
Run Code Online (Sandbox Code Playgroud)

然后我会使用一个simgle sproc进行连接和更新(并从表中删除批处理).

SqlBulkCopy是将这一数据量提供给服务器的最快方法; 你不会淹没在往返旅行中.EF是面向对象的:适用于很多场景 - 但不是这个场景.