【问题标题】:Advanced LINQ Update Statement高级 LINQ 更新语句
【发布时间】:2012-12-01 22:19:33
【问题描述】:

我有一个带有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_New 中的新价格更新 Price_old,然后将这些新价格提交到数据库.

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

【问题讨论】:

  • 如果您需要解决方案,请提供有关数据组织方式的更多信息。事实上,这看起来是一个相当广泛的问题。例如,您有哪个表模式?您可能需要解析输入文件中的数据。你知道怎么做吗?然后构造一个 UPDATE 语句,或者使用一个 DataAdapter。你熟悉这两种技术吗?等
  • 在您撰写此问题时,您的 linq 体验可能会翻倍 :)。

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


【解决方案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 语句将涉及大量 CASE 语句并看起来像像这样:

UPDATE
    PRICE_OLD
SET
    PRICE = CASE WHEN ID =1 THEN 3 WHEN ID = 2 THEN 3.1...
WHERE
    ID IN
    (
        1, 2, ...
    )

您在哪里构造一个字符串,动态传入从您的DataTable 读取的值(当然,所有这些都是通过参数化实现的)。如您所见,这看起来很糟糕,并且可能会产生一些负面的相关性能开销。为了解决这个问题,我实施了一个三阶段的方法:

一个。创建一个与我的DataTable 具有相同架构的临时表。

b.使用SqlBulkCopyDataTable 复制到该临时表。

c。使用我在上面 #2 中提到的 SQL 字符串,将 PRICE_NEW 替换为您的临时表的名称。这会正确更新您的表格,而无需任何参数化。

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

【讨论】:

    【解决方案2】:

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

    看看这个:Introduction to LINQ

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

    【讨论】:

    • @user1902490:db 的类型是什么?数据集?无论如何,您可以使用 LINQ 选择数据,然后使用常规方法进行更新。在您引用的示例中,看起来正在使用实体框架。你有那些预建的类吗?您可能想在此处发布它们。
    • 我正在阅读:msdn.microsoft.com/en-us/vstudio/bb737928#updsimp,他们提供了使用 LINQ 更新基表的示例,尽管我可能完全误读了这些示例。
    • 认为我们的数据库是 sqlserver08,不确定数据集,我认为它只是内置的 system.data.dataset
    • @user1902490:查看我的编辑 - 一些可以帮助您入门的想法。在你朝着这个方向前进之前有很多东西要学(LINQ to SQL)。因为您没有解释您的确切需求,所以很难说使用 LINQ 是否有意义。如果只是一个包含 3 个字段的表,您可以改用 DataTableSqlDataAdapterFill 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多