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