在FromSQL查询和Where In子句中使用ints参数数组

问题描述 投票:0回答:1

我有一个整数列表:

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.'

如何使用这样的参数?

entity-framework-core linq-to-entities entity-framework-core-3.1
1个回答
1
投票

此处不适合使用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)
© www.soinside.com 2019 - 2024. All rights reserved.