Entity framework core 在FromSQL查询和Where in子句中使用ints参数数组

Entity framework core 在FromSQL查询和Where in子句中使用ints参数数组,entity-framework-core,linq-to-entities,entity-framework-core-3.1,Entity Framework Core,Linq To Entities,Entity Framework Core 3.1,我有一个INT列表: var id=新列表{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.' 如何使用这样的

我有一个INT列表:

var id=新列表{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.'

如何使用这样的参数?

使用
插值方法在这里不合适,因为
{String.Join(',',',ids)}
定义了单个字符串占位符,因此EF Core将单个
nvarchar
参数与值
'10,20'
绑定,所以实际的SQL如下

选择用户。*
其中Users.Id位于('10,20')中
这是无效的,因此是例外

您应该改用
Raw
方法。或者

var query=context.Users.FromSqlRaw($@)
选择用户。*
其中Users.Id位于({String.Join(',,ids)})”中;
它将嵌入文本值

选择用户。*
其中Users.Id位于(10,20)
或者,如果要将其参数化,请在SQL内部生成参数占位符,如
{0}
{1}
等,并分别传递值:

var占位符=string.Join(“,”,可枚举.Range(0,ids.Count)
。选择(i=>“{+i+”}”);
var values=ids.Cast().ToArray();
var query=context.Users.FromSqlRaw($@)
选择用户。*
其中Users.Id位于({placeholders})”中,值);
哪一个会生成这样的SQL

选择用户。*
其中Users.Id位于(@p0,@p1)

使用
插值方法在这里不合适,因为
{String.Join(',',,ids)}
定义了单个字符串占位符,因此EF Core将单个
nvarchar
参数与值
'10,20'
绑定,所以实际的SQL如下

选择用户。*
其中Users.Id位于('10,20')中
这是无效的,因此是例外

您应该改用
Raw
方法。或者

var query=context.Users.FromSqlRaw($@)
选择用户。*
其中Users.Id位于({String.Join(',,ids)})”中;
它将嵌入文本值

选择用户。*
其中Users.Id位于(10,20)
或者,如果要将其参数化,请在SQL内部生成参数占位符,如
{0}
{1}
等,并分别传递值:

var占位符=string.Join(“,”,可枚举.Range(0,ids.Count)
。选择(i=>“{+i+”}”);
var values=ids.Cast().ToArray();
var query=context.Users.FromSqlRaw($@)
选择用户。*
其中Users.Id位于({placeholders})”中,值);
哪一个会生成这样的SQL

选择用户。*
其中Users.Id位于(@p0,@p1)

如果需要组合
.FromSql()
和SQL
其中的x IN()
,则对
.FromSql()
调用的输出执行第二个操作

varids=新列表{10,20};
var query=context.Users.FromSqlInterpolated(
$@“选择*
由用户提供);
如果(ID?.Count>0)
{
query=query.Where(user=>ids.Contains(user.Id));
}
结果SQL近似于:

从中选择*(
选择*
来自用户
)u
其中u.Id位于(10,20)
  • 如果ID为空,则没有无效的SQL
  • 如果ID为空字符串,则没有空结果(我使用的是字符串数据类型)

如果需要组合
.FromSql()
和SQL
其中x IN()
,则对
.FromSql()
调用的输出
IQueryable
执行第二个操作

varids=新列表{10,20};
var query=context.Users.FromSqlInterpolated(
$@“选择*
由用户提供);
如果(ID?.Count>0)
{
query=query.Where(user=>ids.Contains(user.Id));
}
结果SQL近似于:

从中选择*(
选择*
来自用户
)u
其中u.Id位于(10,20)
  • 如果ID为空,则没有无效的SQL
  • 如果ID为空字符串,则没有空结果(我使用的是字符串数据类型)