在 FromSQL 查询和 Where In 子句中使用 ints 参数数组
Use array of ints parameter in FromSQL query and Where In clause
我有一个整数列表:
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)
如果您需要组合 .FromSql()
和 SQL WHERE x IN ()
然后对 .FromSql()
调用的输出 IQueryable<T>
执行第二个操作。
var ids = new List { 10, 20 };
var query = context.Users.FromSqlInterpolated(
$@"select *
from Users");
if (ids?.Count > 0)
{
query = query.Where(user => ids.Contains(user.Id));
}
结果 SQL 近似为:
select * from (
select *
from Users
) u
where u.Id in (10,20)
- 没有无效SQL如果ids为空
- 如果 ids 为空字符串(我使用的是字符串数据类型)则没有空结果
我有一个整数列表:
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)
如果您需要组合 .FromSql()
和 SQL WHERE x IN ()
然后对 .FromSql()
调用的输出 IQueryable<T>
执行第二个操作。
var ids = new List { 10, 20 };
var query = context.Users.FromSqlInterpolated(
$@"select *
from Users");
if (ids?.Count > 0)
{
query = query.Where(user => ids.Contains(user.Id));
}
结果 SQL 近似为:
select * from (
select *
from Users
) u
where u.Id in (10,20)
- 没有无效SQL如果ids为空
- 如果 ids 为空字符串(我使用的是字符串数据类型)则没有空结果