0

次の列と値を持つ SQL テーブルがあるとします。

+----+---------+------------+---------+------------+
| ID | Status1 | Condition1 | Status2 | Condition2 |
+----+---------+------------+---------+------------+
|  1 |       1 |          1 |       1 |          1 |
|  2 |       1 |          0 |       1 |          1 |
|  3 |       1 |          1 |       1 |          0 |
|  4 |       1 |          0 |       1 |          0 |
+----+---------+------------+---------+------------+

Condition1 と Condition2 の値に応じて、Status1 と Status2 の値をそれぞれ更新したいと考えています。

私のSQL文は次のようになります。

UPDATE
    myTable
SET
    Status1 = CASE Condition1
                WHEN 1 THEN 3
                ELSE 4
            END,
    Status2  = CASE Condition2
                WHEN 1 THEN 3
                ELSE 4
            END
WHERE
    ID = @targetRowID

各 ID のテーブルに対して上記の SQL ステートメントを個別に実行すると、次の値になります。

+----+---------+------------+---------+------------+
| ID | Status1 | Condition1 | Status2 | Condition2 |
+----+---------+------------+---------+------------+
|  1 |       3 |          1 |       3 |          1 |
|  2 |       4 |          0 |       3 |          1 |
|  3 |       3 |          1 |       4 |          0 |
|  4 |       4 |          0 |       4 |          0 |
+----+---------+------------+---------+------------+

Entity Framework では、次のようにして同じ種類の更新を行います。

var  myRow = dbContext.myTable.Single(r => r.ID == 1);

myRow.Status1 = (myRow.Condition1 == 1) ? 3 : 4;
myRow.Status2 = (myRow.Condition2 == 1) ? 3 : 4;

dbContext.SaveChanges();

これは機能しますが、最初にデータベースからデータをフェッチし、次に 2 番目のクエリを実行して更新を行います。上記の単純な SQL コードのように、更新をすべて一度に行うことは可能ですか?

4

1 に答える 1

2

LINQは、更新前に常にクエリを実行します。これは、テクノロジーのよく知られた煩わしさです。

(nit-pick:「これは機能しますが、最初にデータベースからデータをフェッチし、次に2番目のクエリを実行して更新を実行します。」データベースに送信される2番目のものは「クエリ」ではありません。「クエリ」は標準です。英語は質問であるため、データベースクエリは情報の要求、つまりSELECTステートメントです。UPDATEはコマンドです。)

于 2012-12-07T23:02:43.407 に答える