【问题标题】:Entity Framework Core- passing parameters to Where IN Clause Raw Query实体框架核心 - 将参数传递给 Where IN 子句原始查询
【发布时间】:2019-11-20 09:07:29
【问题描述】:

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

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


    【解决方案1】:

    我认为没有任何方法可以通过将 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

    【讨论】:

    • 感谢 Ivan,您的查询只返回 PmcIds 数组的索引,所以我只做了一些小改动,它就起作用了。 var sqlQuery = $"SELECT * dbo.FROM VwCampaigns WHERE PmcId in ({string.Join(',', pmcIds.Select(x => $"{x}"))}); 再次感谢您的帮助跨度>
    • 没问题!我故意让 sql 查询返回索引,因为替换是在索引的基础上工作的。例如,{0} 将替换为作为第二个参数传递给 .FromSql() 方法的对象数组中的第一项
    【解决方案2】:

    替代 orm 工具?如需访问https://dapper-tutorial.net/querymultiple

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 2018-06-18
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多