代码之家  ›  专栏  ›  技术社区  ›  Joel Martinez

添加到linq to entities中更新的where子句

  •  5
  • Joel Martinez  · 技术社区  · 16 年前

    假设我有一个名为product的表,它有三列:id、customerid、name。ID是主键。该模式不在我的组的控制范围内,我们现在需要始终为所有查询(选择、更新、删除)提供customerid作为参数。说来话长,我宁愿不去…它涉及到触发器:

    所以我的问题是,当我在LinqToEntities中有一个附加的实体时,我想保存一些更新(例如,在本例中我正在更新名称)。如何让它生成SQL:

    update Product set Name = @Name where Id=@Id and CustomerId=@CustomerId
    

    其中,除主键外,还将customerid参数包括在where子句中。

    谢谢:

    2 回复  |  直到 16 年前
        1
  •  7
  •   Marc Gravell    16 年前

    customerid是否有助于唯一标识@id之后的行?我没有真正遵循“触发器”位,因为触发器不知道用于更新的谓词。或者每次都要重新更新customerid(从 UPDATE(...) 在触发器中)

    最简单的选择是将其作为对象更新:

    var qry = from product in model.Products
              where Id == @Id && CustomerId == @CustomerId
              select product;
    
    foreach(Product p in qry) {
        p.Name = @Name;
    }
    
    model.SaveChanges(); // or whatever the method is in EF
    

    如果您知道您需要一个记录,可以使用:

    Product prod = (from product in model.Products
              where Id == @Id && CustomerId == @CustomerId
              select product).Single();
    
    prod.Name = @Name;
    mode.SaveChanges(); // ditto
    

    可以 也可以把它写为实体SQL,但我不确定我会费心,个人…(更新:我刚检查过,我认为实体SQL不包括DML,所以不,你不能-你必须使用上面的命令或常规的SQL命令/存储过程)

        2
  •  0
  •   Craig Stuntz    16 年前

    一种方法是 use a stored proc to do the update . 这使您能够完全控制SQL。

    另一种方法是将customerid添加到实体键。