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_Oldとすべて同じ日付/時間ではない可能性があることに注意してください。

したがって、2つのデータテーブル、、、Price_Oldおよびが作成されます。必要なのは、の新しい価格でPrice_New更新してから、それらの新しい価格をデータベースにコミットすることです。Price_oldPrice_New

私はLINQに少し慣れていません(約30分の経験)。誰かがLINQでこれを行っているかどうか、そして最良の方法は何かについて、私に1つか2つの指針を教えていただければ幸いです。

4

2 に答える 2

1

linq-to-sql のようなものを使用している場合DataContext、Linq 自体ではなく、実際に更新を行うのはオブジェクトです。

私が見る限り、あなたには3つのオプションがあります:

1) オブジェクトを使用して、変更されたオブジェクトDataContextを に追加します。ただし、Terry Aney が指摘したように、このアプローチにはパフォーマンスのオーバーヘッドに関する深刻な問題がいくつかあります。Price_OldDataContext

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) に対して行った変更を尊重する単一の SQL 文字列を生成する場合、DataTableLinq などを介して行う場合、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(もちろん、すべてパラメーター化で実装されています)。ご覧のとおり、これは見栄えが悪く、関連するパフォーマンス オーバーヘッドが負の影響を及ぼしている可能性があります。これを回避するために、次の 3 段階のアプローチを実装します。

a. my と同じスキーマで一時テーブルを作成しますDataTable

b. その一時テーブルSqlBulkCopyにコピーするために使用します。DataTable

c. 上記の #2 で言及した SQL 文字列を使用してPRICE_NEW、一時テーブルの名前に置き換えます。これにより、パラメータ化を必要とせずにテーブルが正しく更新されます。

これにはいくつかの文字列操作が含まれる場合がありますが、利点はセットベースの更新です。

于 2012-12-13T23:50:42.787 に答える
0

その名前から、LINQ=統合言語クエリ-データを読み取ることを目的としています。LINQクエリを使用してデータベースの更新を直接実行することはできません。データベースの更新を可能にするDataContextクラスがあります-それはLINQ上で実行されます。

これをチェックしてください:LINQの紹介

また、これも:チュートリアル:単純なオブジェクトモデルとクエリ(C#)

于 2012-12-13T22:46:08.167 に答える