猿问

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

当IN子句的值列表来自业务逻辑时,使用Dapper ORM用IN子句编写查询的最佳方法是什么?例如,假设我有一个查询:


SELECT * 

  FROM SomeTable 

 WHERE id IN (commaSeparatedListOfIDs)

在commaSeparatedListOfIDs正在从业务逻辑传递,它可以是任何类型的IEnumerable(of Integer)。在这种情况下,我将如何构造查询?到目前为止,我是否必须做我基本上一直在做的事情,即基本上是字符串连接还是我不知道的某种高级参数映射技术?


12345678_0001
浏览 1280回答 3
3回答

宝慕林4294392

直接从GitHub项目主页:Dapper允许您传递IEnumerable并将自动参数化您的查询。connection.Query<int>(&nbsp; &nbsp; @"select *&nbsp;&nbsp; &nbsp; &nbsp; from (select 1 as Id union all select 2 union all select 3) as X&nbsp;&nbsp; &nbsp; &nbsp; where Id in @Ids",&nbsp;&nbsp; &nbsp; new { Ids = new int[] { 1, 2, 3 });将被翻译成:select *&nbsp;from (select 1 as Id union all select 2 union all select 3) as X&nbsp;where Id in (@Ids1, @Ids2, @Ids3)// @Ids1 = 1 , @Ids2 = 2 , @Ids2 = 3

牧羊人nacy

如果您的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&nbsp; &nbsp; INNER JOIN @tvp t ON p.ProviderId = t.ProviderId";在Dapper查询调用中传递DataTablesqlConn.Query(query, new {tvp = tvpTable.AsTableValuedParameter("dbo.MyTVP")});当您要对多个列进行批量更新时,这也非常有用-只需构建一个TVP并UPDATE使用内部连接到TVP。
随时随地看视频慕课网APP
我要回答