实体框架:使用Case Statement更新数据

时间:2012-12-07 22:57:13

标签: entity-framework dbcontext entity-framework-4.3

想象一下,我有一个包含以下列和值的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();

这样可行,但它首先从数据库中获取数据,然后执行第二次查询以执行更新。是否可以像上面的普通SQL代码那样一次性完成更新?

1 个答案:

答案 0 :(得分:2)

LINQ始终在更新之前执行查询。这是该技术的一个众所周知的烦恼。

(nit-pick:“这样可行,但它首先从数据库中提取数据,然后再进行第二次查询以进行更新。”发送到数据库的第二件事不是“查询”。 “标准英语是一个问题,因此数据库查询是对信息的请求,即SELECT语句.UPDATE是一个命令。)