设置 WHERE 条件以在 ExecuteSqlCommand() 中使用 Ids.Contains()

Jon*_*ood 3 c# sql-server entity-framework dbcontext

我正在使用实体框架,并且想要执行批量更新。加载每一行、更新这些行,然后将它们保存回数据库的效率太低了。

所以我更愿意使用DbContext.Database.ExecuteSqlCommand(). 但是,如何使用此方法来更新 ID 列表中包含的 ID 的所有行呢?

这是我到目前为止所拥有的。

IEnumerable<int> Ids;
DbContext.Database.ExecuteSqlCommand("UPDATE Messages SET Viewed = 1 WHERE Id IN (@list)", Ids);
Run Code Online (Sandbox Code Playgroud)

我意识到我可以使用正确的查询手动构建一个字符串,但我更愿意按照通常建议的方式传递参数。

有什么办法可以实现这一点吗?

Nko*_*osi 5

您仍然可以构建参数并将它们包含在参数化查询中。

生成时查询看起来像这样

UPDATE Messages SET Viewed = 1 WHERE Id IN (@p0, @p1, @p2, ..., @pn)
Run Code Online (Sandbox Code Playgroud)

所以给出

IEnumerable<int> Ids;
Run Code Online (Sandbox Code Playgroud)

然后

var parameters = Ids.Select((id, index) => new SqlParameter(string.Format("@p{0}", index), id));
var parameterNames = string.Join(", ", parameters.Select(p => p.ParameterName));
var query = string.Format("UPDATE Messages SET Viewed = 1 WHERE Id IN ({0})", parameterNames);

int affected = DbContext.Database.ExecuteSqlCommand(query, parameters.ToArray());
Run Code Online (Sandbox Code Playgroud)