efcore 中, 使用 FromSql 查询时, 如何设置 where in 参数?

13 小时 23 分钟前
 bthulu

像下面这样, 是查不出来的. 是有什么特殊姿势我不会的吗? google 了半天也没找出来怎么传递集合参数进去.

var ids = new List<string>() { "A001", "B001" };
appDbContext.RackTransfers.FromSql($"select * from RackTransfers where Id IN ({ids})");
310 次点击
所在节点    .NET
16 条回复
corcre
12 小时 54 分钟前
可能就是不支持的吧 之前上网搜了一下发现没解决方案就放弃了, 现在一般要不就把 ids 给先处理好传进去(处理成('A001','B001')然后字符串拼接)
要不就根据 ids 的长度循环塞进去, 例如..... IN {@id0,@id1,@id2}然后按正常方式传参...
反正都挺麻烦的🐶🐶🐶
jiangzm
12 小时 35 分钟前
EF.Functions.Like 或者 Contains
luojianxhlxt
12 小时 20 分钟前
你这是 sql 语句,得用 string.join 拼接成 where id in('A001','A002')
nikenidage1
12 小时 7 分钟前
1.支持
2.不能用 FromSql ,你这不是 linq 了啊
3.这样
appDbContext. RackTransfers.Where(r=> ids.Contains(r.Id));
nikenidage1
12 小时 5 分钟前
题外话,不知道你怎么搜索的,怎么会没有相关资料的呢?
谷歌,关键字 entity framework where in ,第一条就是 stackoverflow 上的答案啊
wu00
12 小时 3 分钟前
appDbContext.RackTransfers.FromSql($"select * from RackTransfers where Id IN ('{string.Join("','", ids)}')");
bthulu
12 小时 3 分钟前
@nikenidage1 你这个大家都知道, 但是很多情况下, 没法这样查. 比如取 group by 后组内第一条返回一个集合, 目前 ef core 还不支持这个功能, 官方说至少的 efcore10 才有可能支持.
```
using AppDbContext dbContext = CreateAppDbContext();
var queryable = dbContext.Racks.Where(e => e.Occupied == true).GroupBy(e => e.Aisle)
.Select(g => g.OrderBy(e => e.Col).Take(1));
// 支持
List<IEnumerable<Rack>> list = queryable.ToList();
// 不支持, 可能 efcore10.0 会支持, 参考 https://github.com/dotnet/efcore/issues/28002
List<Rack> racks = queryable.SelectMany(e => e).ToList();
```
bthulu
12 小时 1 分钟前
@nikenidage1 请注意看题, 使用 FromSql 查询时, 不是使用 Where 查询.
Removable
11 小时 46 分钟前
https://v2ex.com/i/XFsksX67.jpeg

应该只能这样了吧?
Removable
11 小时 44 分钟前
@Removable #7 可以单独写个静态类去处理字符串/数字类型的拼接,省得每次都要写 string.Join 和 Linq
a194259440
11 小时 35 分钟前
OP 用的什么版本?.NET6 现在是这样,可以用参数化进行传参,可以试试
var ids = new List<string>() { "A001", "B001" };
var parameters = new[]
{
new NhgdbParameter("@Ids ", ids )}
};
appDbContext.RackTransfers.FromSqlRaw($"select * from RackTransfers where Id IN @Ids ",parameters );
a194259440
11 小时 34 分钟前
@a194259440 如果不行,建议用其他 ORM 框架,Dapper 保底可以实现
nikenidage1
11 小时 20 分钟前
@bthulu 哦用 FromSql 那我理解错了
bthulu
11 小时 6 分钟前
@a194259440 在.net8.0+efcore8.0 中实测下面两种方式都不行, 直接报错 System.NotSupportedException
方式一:
int[] ids = [1, 2, 3];
List<MySqlParameter> parameters = ids.Select(e => new MySqlParameter("@Ids", e)).ToList();
List<Rack> racks = dbContext.Racks.FromSqlRaw("select * from rack where id in (@Ids)", parameters).ToList();
方式二:
int[] ids = [1, 2, 3];
MySqlParameter parameters = new MySqlParameter("@Ids", ids);
List<Rack> racks = dbContext.Racks.FromSqlRaw("select * from rack where id in (@Ids)", parameters).ToList();
bthulu
11 小时 1 分钟前
上面两个示例中, 将 new MySqlParameter("@Ids", ...)改为 new MySqlParameter("Ids", ...), 也是一样的报错
PopRain
8 小时 59 分钟前
in 的参数化查询语句是这样的:where x in (@0,@1,@2..... ) ; 所以,后台需要把 List 转换为一个个的参数,不知道 efcore 是否有这个功能,我们公司是自己实现的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1078596

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX