如果你正在使用类似的LINQ到SQL,它的DataContext
对象实际执行更新,而不是LINQ本身。
你有三个选择,到目前为止,我所看到的:
1)使用DataContext
对象修改Price_Old
对象添加到DataContext
。但是,由于Terry Aney has noted,这种方法存在一些严重的性能开销问题。
2)如果PRICE_NEW
是另一个表,你可以使用一个UpdateBatch
方法类似于一个特里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
所做的更改一个SQL字符串,通过LINQ的还是其他什么东西吧,你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
(所有参数来实现,当然)读取数值。正如你所看到的,这看起来很糟糕,可能会有一些负面的相关性能开销。为了解决这个问题,我实施了一个三阶段的方法:
a。创建一个与我的DataTable
具有相同架构的临时表。
b。使用SqlBulkCopy
将DataTable
复制到该临时表。
c。使用上面#2中提到的SQL字符串,将PRICE_NEW
替换为临时表的名称。这正确地更新你的表,而不需要任何参数化。
这可能涉及一些字符串操作,但好处是基于集合的更新。
如果您需要解决方案,请提供有关数据组织方式的更多信息。事实上,它看起来像一个相当广泛的问题。例如,你有哪个表格模式?您可能需要解析输入文件中的数据。你知道该怎么做吗?然后构造一个UPDATE语句,或者使用一个DataAdapter。你熟悉哪种技术?等等。 – Neolisk
在你编写这个问题的时候,你可以将你的linq体验翻倍:)。 –