CSharp - 在 Entity Framework 4中,C# 建议使用临时表或者表变量 更新性能 Entity Framework

  显示原文与译文双语对照的内容

我需要在表中更新一个位字段,并将该字段设置为 true 中的特定in的in 。

id是从外部进程传入的。

我想在纯SQL中最有效的方法是创建一个temp表并使用and填充它,然后相应地设置位字段。

我可以创建一个SPROC来获取 id,但是可能有 200行需要这个标志集,所以它可能不是最有效的方法。 使用in语句has限制可以传递和性能的数据量。

如何使用 Entity Framework 实现上述功能

我想可以创建一个SPROC来创建一个临时表,但是这不存在于模型透视图中。

是否有一种在运行时动态添加实体的方法。 [Or is this approach just going to cause headaches] 。

我正在做上述假设,尽管填充了 300,000行的临时表,并且执行 Join的时间比调用 SPROC 300,000时快。

我应该考虑另一种方法。

时间: 原作者:

对于诸如 300k 行的数据量,我将忽略。 我将按 Having 这样的表来执行以下操作:

 
BatchId RowId



 

其中RowId是要更新的行的PK,而BatchId仅引用 300k 行( 同时允许多个 multiple )的这个"跑步"。

我将生成一个新的BatchId ( 这可能是任何独特的-Guid跳跃),并使用 SqlBulkCopy 将te记录插入到这个表,i.e.


100034 17


100034 22


...


100034 134556



然后,我使用 simgle sproc来完成 Join 和更新( 然后从表格中删除这个批次) 。

SqlBulkCopy 是获得这种数据量的最快方法;你不会在循环行程中沉陷。 EF面向对象:适合许多场景,但不是这样的。

原作者:

我将Marcs响应作为答案分配给你,但我只是想详细介绍一下如何实现需求。 Marc响应在解决方案中有很大的帮助。

我们必须处理一个目标/准则来保存在 Entity Framework 中,而不是使用存储,尽管我们的解决方案不适合它的他。

我们使用 BatchId [uniqueidentifier] 和ItemId列在数据库中创建了一个项目表。

这个表被添加到EF模型中,所以我们没有使用临时表。

在上载这些id时,这个表使用 Ids [Inserts are quick enough we find using EF ] 填充

然后使用 context.ExecuteStoreCommand 运行SQL以执行 Join 表和主表,并在主表中为该会话创建的记录更新位字段。

我们最终清除了这个batchId表。

我们拥有性能,保持在我们没有SPROC目标的范围内。 [Which not of us agree with :) but its a democracy ]

我们的精确要求稍微复杂一些,但在使用 Entity Framework 时需要更好的更新性能。

Liam

原作者:
...