为了账号安全,请及时绑定邮箱和手机立即绑定

使用Dapper ORM从X WHERE ID IN(…)中选择*

使用Dapper ORM从X WHERE ID IN(…)中选择*

12345678_0001 2019-11-27 10:18:51
当IN子句的值列表来自业务逻辑时,使用Dapper ORM用IN子句编写查询的最佳方法是什么?例如,假设我有一个查询:SELECT *   FROM SomeTable  WHERE id IN (commaSeparatedListOfIDs)在commaSeparatedListOfIDs正在从业务逻辑传递,它可以是任何类型的IEnumerable(of Integer)。在这种情况下,我将如何构造查询?到目前为止,我是否必须做我基本上一直在做的事情,即基本上是字符串连接还是我不知道的某种高级参数映射技术?
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

直接从GitHub项目主页:


Dapper允许您传递IEnumerable并将自动参数化您的查询。


connection.Query<int>(

    @"select * 

      from (select 1 as Id union all select 2 union all select 3) as X 

      where Id in @Ids", 

    new { Ids = new int[] { 1, 2, 3 });

将被翻译成:


select * 

from (select 1 as Id union all select 2 union all select 3) as X 

where Id in (@Ids1, @Ids2, @Ids3)


// @Ids1 = 1 , @Ids2 = 2 , @Ids2 = 3


查看完整回答
反对 回复 2019-11-27
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

如果您的IN子句太大而无法处理MSSQL,则可以很轻松地在Dapper中使用TableValueParameter。


在MSSQL中创建TVP类型:


CREATE TYPE [dbo].[MyTVP] AS TABLE([ProviderId] [int] NOT NULL)

使用DataTable与TVP相同的列创建一个,并使用值填充它


var tvpTable = new DataTable();

tvpTable.Columns.Add(new DataColumn("ProviderId", typeof(int)));

// fill the data table however you wish

修改您的Dapper查询以INNER JOIN在TVP表上执行以下操作:


var query = @"SELECT * FROM Providers P

    INNER JOIN @tvp t ON p.ProviderId = t.ProviderId";

在Dapper查询调用中传递DataTable


sqlConn.Query(query, new {tvp = tvpTable.AsTableValuedParameter("dbo.MyTVP")});

当您要对多个列进行批量更新时,这也非常有用-只需构建一个TVP并UPDATE使用内部连接到TVP。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 1279 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信