1

我有一个Price_old类似的数据库:

Date --- Hour --- Price
_____________________________
Jan 1 --- 1 --- $3.0    
Jan 1 --- 2 --- $3.1    
Jan 1 --- 3 --- $3.3    
Jan 1 --- 4 --- $3.15    
Jan 2 --- 1 --- $2.95    
Jan 2 --- 2 --- $3.2    
Jan 2 --- 3 --- $3.05

然后我拥有的是一个具有相同结构的电子表格,我将读入数据表,我将调用新的Price_New数据表,请注意 price new 可能与 Price_Old 的日期/小时不同

所以,我最终得到了 2 个数据表Price_Old, 和Price_New,我需要做的是Price_old使用 中的新价格进行更新Price_New,然后将这些新价格提交到数据库中。

我对 LINQ 有点陌生(大约 30 分钟的经验),如果有人能给我一两个关于这是否在 LINQ 中执行以及最好的方法是什么的指针,我将不胜感激。

4

2 回答 2

1

如果您使用的是 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.UPDATECASE

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为您的临时表的名称。这可以正确更新您的表格,而无需任何参数化。

这可能涉及一些字符串操作,但好处是基于集合的更新。

于 2012-12-13T23:50:42.787 回答
0

从它的名字来看,LINQ = Language-Integrated Query——它的意思是读取数据。您不能使用 LINQ 查询直接执行数据库更新。有一个DataContext类,它使数据库更新成为可能——它运行在 LINQ 之上。

看看这个:LINQ 简介

还有这个:演练:简单对象模型和查询(C#)

于 2012-12-13T22:46:08.167 回答