【问题标题】:Entity Framework: Update data with Case Statement实体框架:使用案例语句更新数据
【发布时间】:2012-12-07 22:57:12
【问题描述】:

假设我有一个包含以下列和值的 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 代码那样一次性完成更新?

【问题讨论】:

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


    【解决方案1】:

    LINQ 总是在更新之前进行查询。这是该技术众所周知的烦恼。

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

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多