Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 添加到LINQtoEntities中更新的Where子句_Sql_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

Sql 添加到LINQtoEntities中更新的Where子句

Sql 添加到LINQtoEntities中更新的Where子句,sql,linq,entity-framework,linq-to-entities,Sql,Linq,Entity Framework,Linq To Entities,假设我有一个名为Product的表,有三列:Id、CustomerId、Name。Id是主键。模式不在我的组的控制范围内,我们现在需要始终为所有查询(选择、更新、删除)提供CustomerId作为参数。说来话长,我不想谈。。。它涉及触发器:-P 所以我的问题是,当我在LinqToEntities中有一个附加的实体时,我想保存一些更新(在本例中,假设我正在更新名称)。如何让它生成SQL: update Product set Name = @Name where Id=@Id and Custom

假设我有一个名为Product的表,有三列:Id、CustomerId、Name。Id是主键。模式不在我的组的控制范围内,我们现在需要始终为所有查询(选择、更新、删除)提供CustomerId作为参数。说来话长,我不想谈。。。它涉及触发器:-P

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

update Product set Name = @Name where Id=@Id and CustomerId=@CustomerId
其中除主键外,Where子句中还包括customerId参数

谢谢:-)

一种方法是。这使您能够完全控制SQL


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

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命令/SPROC)

我们希望不惜一切代价避免存储过程。。。试图避免重新编写大量已经存在的LINQ UPDATEST代码CustomerId不是主键的一部分,但由于DBA使用了一些触发器,它必须位于update语句的Where子句中。因此,上面的方法不起作用,因为保存更改最终会在where子句中生成一个update语句,该语句中只有Id=@Id:(但您的代码(如果它起作用的话)也不会;要在触发器中有用,您需要在更新集中使用它,而不是在where中。