回答

收藏

如何在Dapper中使用“在哪里”

技术问答 技术问答 335 人阅读 | 0 人回复 | 2023-09-14

我一直在尝试失败,在Dapper中使用IEnumerablewith withWHERE IN子句已经有一段时间了。
3 s0 G) Q, W# ^" U6 S: O- H- y% q在文档中,它确实说IEnumerable<i>支持在a中使用,WHERE IN但我什至无法使它正常工作。
0 Y/ F8 \  h9 FDapper allow you to pass in IEnumerable<i> and will automatically" z, w0 p8 h8 r& L( W# C
parameterize your query.8 v. l$ |! q$ I' C# K- {+ f  o
我不断收到的错误消息是Sql语法错误。 Incorrect syntax near ','./ x3 |1 O- v' u  F; C
我整理了一些测试代码,希望它们能证明我正在尝试实现的目标。( T/ \" V) S* p) R" E2 ]
1 D. S/ M5 l/ J) K7 o5 I  l
string connString = &quot;Server=*.*.*.*;Database=*;User Id=*assword=*;&quot;;+ P( {& K$ U* g$ b- q- @' g6 }( S
string sqlStringIn = @&quot;SELECT StringText FROM
' e; h0 r' J0 x& F1 M3 h                (SELECT 1 ID, 'A' StringID, 'This is a test' StringText
) r4 e# U$ f4 R) j                UNION SELECT 2 ID, 'B' StringID, 'Another test' StringText
) J& K; u/ l9 q( l                UNION SELECT 3 ID, 'C' StringID, 'And another' StringText7 h0 V6 E: n0 i/ d% e) S2 B- ]3 w5 Q
                UNION SELECT 4 ID, 'D' StringID, 'and again' StringText
3 }/ t5 q/ L8 b. Z/ H, h# P* ~                UNION SELECT 5 ID, 'E' StringID, 'yet again' StringText) data; c) \5 ^: m  k0 ?! Q
                WHERE StringId IN (@str)&quot;;
1 k+ j/ e& O1 cstring sqlIntegerIn = @&quot;SELECT StringText FROM " a* m5 \( @6 u
                (SELECT 1 ID, 'A' StringID, 'This is a test' StringText6 _$ a- G  O4 ?( k
                UNION SELECT 2 ID, 'B' StringID, 'Another test' StringText2 _. W* g) S: r0 `
                UNION SELECT 3 ID, 'C' StringID, 'And another' StringText* {& E. t# j  O+ {1 u9 g- g
                UNION SELECT 4 ID, 'D' StringID, 'and again' StringText6 g, ~7 M( E3 |. g2 Z- [- i
                UNION SELECT 5 ID, 'E' StringID, 'yet again' StringText) data
. t7 m& H! s# O) |                WHERE ID IN (@integer)&quot;;
# v2 I4 W  S* ]# E- ]$ |# b5 \# K  j0 ?% r& y
using (SqlConnection conn = new SqlConnection(connString)). v# |8 b: w( |# |4 j8 f( P
{: k! |6 A5 a9 p; V* ]9 _# s$ X8 v
    conn.Open();
4 F" [/ d& L4 e( J7 T: j    List<i> integers = new List<i>{ 1, 2, 3 };
5 X  c, V  M3 y( s9 w    List strings = new List { &quot;A&quot;, &quot;B&quot;, &quot;C&quot; };8 C( q$ V8 u0 w& t& _7 w
    var parameters = new {str = strings, integer = integers };
3 i  T* i: _. V: b8 `. @    //fails here
' d  q& A8 z/ H. Y    IEnumerable intTest = conn.Query(sqlIntegerIn, parameters, commandType: System.Data.CommandType.Text);
" `/ e# Y6 A/ a, u  x, j- E+ f; c    //and here
* x- {, Q, [, j4 ^    IEnumerable stringTest = conn.Query(sqlStringIn, parameters, commandType: System.Data.CommandType.Text);
7 a- L/ J. f8 T7 F7 A7 V7 L}+ A$ F5 O! \, P' M
                % D7 n1 _2 ^3 K  J% F: \$ D
解决方案:# j4 H+ t  i1 `
               
% C" ?6 F. l. u" D3 M! O* {7 h
0 J( d- b$ i" x' n7 L3 p
1 W  s" q4 U4 i5 Z: D5 @" ]                为了执行此处需要的操作,dapper需要即时更改SQL-因此需要 真正 确保它在做正确的事情。常规有效的SQL语法包括括号:1 @( U) [! q3 X# G7 N" B. ~
WHERE StringId IN (@str)
7 H$ v4 X8 B' w* B2 E/ b2 f5 l为了消除歧义, voodoo dapper语法 省略 了括号:
4 H7 i# d6 R9 V4 E# I7 L8 B0 U: @WHERE StringId IN @str% y- ?( T& o$ L  U) K4 m! K
如果检测到此错误,它将查找名为的参数str,并将其扩展为以下参数之一:
! p! I5 _% e  n' ?) j0 f& \# X7 ^0 QWHERE 1=0 -- if no values
# i$ Q/ K( b/ U/ M, Q2 `1 t& c5 NWHERE StringId = @str -- if exactly one value) L3 M2 c  [. H  x
WHERE StringId IN (@str0, @str1, ...) -- if more than one value
3 A/ n  H( i$ w4 V" p. S: s但简短的版本:删除括号。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则