在 EF 6.0 中,我想根据 WHERE 过滤器更新一些记录。我从 ids 整数列表中识别出的记录。问题是它将 id 列表视为 nvarchar“61,62,63”,并且 IN 运算符在整数和 nvarchar 之间不起作用。
var status = MyEnum.MyEnumValue;
var idList = new List<int>(...);
context.Database.ExecuteSqlInterpolated(
$"UPDATE MyTable SET MyCustomStatus = {status} WHERE Id IN ({string.Join(", ", idList)})"
);
错误
Microsoft.Data.SqlClient.SqlException
HResult=0x80131904
Message=Conversion failed when converting the nvarchar value '61, 62, 63' to data type int.
Source=Core Microsoft SqlClient Data Provider
StackTrace:
at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
...
你知道有什么解决办法吗?
您可以选择使用 ExecuteSqlRaw 方法,以便使用原始 SQL 字符串以及单独提供的参数。
示例:
var status = "my custom status";
// Create a parameter for the list of integers
var idListParameter = string.Join(",", idList.Select(id => $"@p{id}"));
var parameters = idList.Select((id, index) => new SqlParameter($"@p{id}", id)).ToList();
// Add a new SqlParameter for the status parameter
parameters.Add(new SqlParameter("@status", status));
_context.Database.ExecuteSqlRaw(
$"UPDATE MyTable SET MyCustomStatus = @status WHERE Id IN ({idListParameter})",parameters
);