我有一个整数列表:
var ids =新列表{10,20};
而且我需要找到具有该ID的用户:
context.Users.FromSqlInterpolated($@"
select Users.*
where Users.Id in ({String.Join(',', ids)})"
但出现以下错误:
'Conversion failed when converting the nvarchar value '10, 20' to data type int.'
如何使用这样的参数?
此处不适合使用Interpolated
方法,因为{String.Join(',', ids)}
定义了单个字符串占位符,因此EF Core将单个nvarchar
参数绑定为值'10,20'
,因此实际的SQL就像这样
select Users.*
where Users.Id in ('10,20')
这是无效的,因此是例外。
您应该改用Raw
方法。要么
var query = context.Users.FromSqlRaw($@"
select Users.*
where Users.Id in ({String.Join(',', ids)})");
将嵌入文字值
select Users.*
where Users.Id in (10,20)
或者如果要对其进行参数化,请在SQL内部生成参数占位符,例如{0}
,{1}
等,并分别传递值:
var placeholders = string.Join(",", Enumerable.Range(0, ids.Count)
.Select(i => "{" + i + "}"));
var values = ids.Cast<object>().ToArray();
var query = context.Users.FromSqlRaw($@"
select Users.*
where Users.Id in ({placeholders})", values);
这将生成这样的SQL
select Users.*
where Users.Id in (@p0,@p1)