EF 6 更新查询和带有整数列表比较的 Where 子句

EF 6 Update query and Where clause with list of integers comparison

提问人:Mihai Socaciu 提问时间:11/13/2023 更新时间:11/13/2023 访问量:46

问:

在 EF 6.0 中,我想根据 WHERE 筛选器更新一些记录。我从 id 的整数列表中识别的记录。问题是它将 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)
...

你知道什么解决方案吗?

C# SQL .NET 数据库 实体框架

评论

1赞 Eldar 11/13/2023
它值到类型为 varchar 的参数中。相反,您可以将 where 部分连接到插值部分。

答:

1赞 Denis Micheal 11/13/2023 #1

您可以选择使用 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.ToArray()
 );

评论

1赞 Mihai Socaciu 11/14/2023
这行得通。我还会添加其他人检查是否为空,否则查询将使用错误的语法构造。idListParameter