高级LINQ更新声明

时间:2012-12-13 22:42:19

标签: sql vb.net linq sql-server-2008

我有一个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_Old

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

我是LINQ的新手(大约30分钟的经验),如果有人能给我一两个关于LINQ中是否有这样做的指针以及最好的方法,我会非常感激。

2 个答案:

答案 0 :(得分:1)

如果您正在使用linq-to-sql之类的东西,那么实际进行更新的DataContext对象,而不是Linq本身。

据我所见,您有三种选择:

1)使用DataContext对象将修改后的Price_Old个对象添加到DataContext。但是,正如Terry Aney has noted一样,这种方法存在一些严重的性能开销问题。

2)如果PRICE_NEW是另一个表,你可以使用类似于Terry Aney介绍的UpdateBatch方法(参见上面的链接),但不幸的是,我还没有找到允许的变体您可以为每个唯一行指定具有新值的现有数据列表。但如果有,结果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语句都会涉及大量{{1}声明,看起来像这样:

CASE

在构造字符串的地方,动态传入从UPDATE PRICE_OLD SET PRICE = CASE WHEN ID =1 THEN 3 WHEN ID = 2 THEN 3.1... WHERE ID IN ( 1, 2, ... ) 读取的值(当然,所有这些都是通过参数化实现的)。正如您可能看到的,这看起来很糟糕,可能会产生一些负面的相关性能开销。为了解决这个问题,我实施了一个三阶段的方法:

一个。使用与DataTable相同的架构创建临时表。

湾使用DataTableSqlBulkCopy复制到该临时表。

℃。使用上面#2中提到的SQL字符串,将DataTable替换为临时表的名称。这样就可以正确更新您的表格而无需任何参数化。

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

答案 1 :(得分:0)

从名称LINQ =语言集成查询 - 它意味着读取数据。您无法使用LINQ查询直接执行数据库更新。有一个DataContext类,它使数据库更新成为可能 - 它运行在LINQ之上。

检查出来:Introduction to LINQ

还有这一个:Walkthrough: Simple Object Model and Query (C#)