如果您使用的是 linq-to-sql 之类的东西,它DataContext
实际上是执行更新的对象,而不是 Linq 本身。
据我所知,您有三个选择:
1) 使用DataContext
对象将修改后的Price_Old
对象添加到DataContext
. 然而,正如Terry Aney 所指出的,这种方法存在一些严重的性能开销问题。
2)如果PRICE_NEW
是另一张表,您可以使用UpdateBatch
类似于 Terry Aney 介绍的方法(请参阅上面的链接),但不幸的是,我还没有找到一种变体,允许您为每个表指定包含新值的现有数据列表独特的行。但如果有,生成的 SQL 将如下所示:
UPDATE
PRICE_OLD
SET
PRICE =
(
SELECT
PRICE
FROM
PRICE_NEW
WHERE
PRICE_OLD.DATE=PRICE_NEW.DATE
AND PRICE_OLD.HOUR = PRICE_NEW.HOUR
)
WHERE
EXISTS
(
SELECT
PRICE
FROM
PRICE_NEW
WHERE
PRICE_OLD.DATE=PRICE_NEW.DATE
AND PRICE_OLD.HOUR = PRICE_NEW.HOUR
)
当你开始做这样的事情时,你也可以将这个 SQL 包装在一个存储过程中,然后你可以添加到你DataContext
的代码中并调用它。并不是说弄清楚如何操作表达式树不会很有趣。不幸的是,即使这样也不允许您做您想做的事情:操作某种数据表中的数据,然后神奇地将更新应用到数据库。这让我
3) 如果您要生成一个尊重您对DataTable
.UPDATE
CASE
UPDATE
PRICE_OLD
SET
PRICE = CASE WHEN ID =1 THEN 3 WHEN ID = 2 THEN 3.1...
WHERE
ID IN
(
1, 2, ...
)
您在哪里构造一个字符串,动态传入从您读取的值DataTable
(当然,所有这些都是通过参数化实现的)。如您所见,这看起来很糟糕,并且可能会产生一些负面的相关性能开销。为了解决这个问题,我实施了一个三阶段的方法:
一个。创建一个与 my 具有相同架构的临时表DataTable
。
湾。用于SqlBulkCopy
将 复制DataTable
到该临时表。
C。使用我在上面 #2 中提到的 SQL 字符串,替换PRICE_NEW
为您的临时表的名称。这可以正确更新您的表格,而无需任何参数化。
这可能涉及一些字符串操作,但好处是基于集合的更新。