首页 > 解决方案 > 实体框架核心 - 将参数传递给 Where IN 子句原始查询

问题描述

我只想从数据库中选择一系列值的数据,例如:

SELECT * from VwCampaigns where PmcId in (1,2,3)

这是我在 Entity Framework Core 中的代码

_dbContext.CampaignsView.FromSql("SELECT * from VwCampaigns where PmcId in ({1})", pmcIds).ToList()

如何在原始查询中传递一系列整数?

标签: entity-framework-core

解决方案


我认为没有任何方法可以通过将 Id 列表作为参数传递来做到这一点,因为 EF 试图将其解释为单个参数。对我有用的是以下内容:

给定一个 ID 列表:1,2,3

将列表转换为对象数组,以便您可以作为参数传递给 FromSql,因为它接受参数 object[],EF 核心会将它们视为单独的参数。

构造一个查询,该查询将为 ID 列表中的每个项目创建单独的参数,以便最终得到如下所示的查询:

“SELECT * from VwCampaigns where PmcId in ({0},{1},{2})”

我的工作代码:

var pmcIds = new List<int> { 1,2,3 }.Select(x => (object)x).ToArray();
var sqlQuery = $"SELECT * FROM dbo.VwCampaigns WHERE Id in ({string.Join(',', pmcIds.Select(x => $"{{{Array.IndexOf(pmcIds, x)}}}"))})";

var results = _dbContext.CampaignsView.FromSql(sqlQuery, pmcIds).ToList();

或者,您可以使用如下 SQL 命令:Mark Byers' Answer


推荐阅读