2012-12-13 47 views
1

我有数据的基础上与Price_old,如:高级LINQ更新语句

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 

那么,什么我是一个电子表格,具有相同的结构,我会被读成一个DataTable,我会打电话给新的DataTable Price_New,注意价格新的可能不具有完全相同的日期/时间为Price_Old

所以,我结束了2个数据表,Price_OldPrice_New,我需要做的是更新Price_old新价格在Price_New,然后将这些新价格提交给D. atabase。我有点新LINQ(大约30分钟的经验),真的很感激,如果有人可以给我一个或两个指针,这是否在LINQ做什么和最好的方法是什么。

+1

如果您需要解决方案,请提供有关数据组织方式的更多信息。事实上,它看起来像一个相当广泛的问题。例如,你有哪个表格模式?您可能需要解析输入文件中的数据。你知道该怎么做吗?然后构造一个UPDATE语句,或者使用一个DataAdapter。你熟悉哪种技术?等等。 – Neolisk

+0

在你编写这个问题的时候,你可以将你的linq体验翻倍:)。 –

回答

0

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

查看:Introduction to LINQ

而且还这样一条:Walkthrough: Simple Object Model and Query (C#)

+0

@ user1902490:db的类型是什么?数据集?无论如何,您可以使用LINQ选择数据,然后使用常规方法进行更新。在您引用的示例中,它看起来像正在使用实体框架。你有预先建好的课程吗?你可能想在这里发表。 – Neolisk

+0

我正在阅读:http://msdn.microsoft.com/en-us/vstudio/bb737928#updsimp 他们有使用LINQ更新基表的示例,但我可能完全误读了示例。 – user1902490

+0

认为我们的数据库是sqlserver08,不确定数据集,我认为它只是内置在system.data.dataset – user1902490

1

如果你正在使用类似的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。使用SqlBulkCopyDataTable复制到该临时表。

c。使用上面#2中提到的SQL字符串,将PRICE_NEW替换为临时表的名称。这正确地更新你的表,而不需要任何参数化。

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