gpt4 book ai didi

entity-framework-core - 在 FromSQL 查询和 Where In 子句中使用整数参数数组

转载 作者:行者123 更新时间:2023-12-04 16:27:20 31 4
gpt4 key购买 nike

我有一个整数列表:

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 绑定(bind)单个 nvarchar带值的参数 '10,20' ,所以实际的SQL是这样的

select Users.* 
where Users.Id in ('10,20')

这是无效的,因此是异常(exception)。

您应该使用 Raw方法代替。任何一个

var query = context.Users.FromSqlRaw($@" 
select Users.*
where Users.Id in ({String.Join(',', ids)})");

这将嵌入文字值

select Users.* 
where Users.Id in (10,20)

或者,如果您想对其进行参数化,请生成参数占位符,如 {0} , {1}等在 SQL 中并分别传递值:

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)

关于entity-framework-core - 在 FromSQL 查询和 Where In 子句中使用整数参数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60934407/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com