"WHERE x IN"子句与dapper和postgresql抛出42601:语法错误在"$ 1"处或附近

Sav*_* B. 18 c# postgresql asp.net-mvc npgsql dapper

我有一个字符串数组,我想要一个包含IN子句的查询,如:

"... WHERE t.name IN ('foo', 'bar', 'baz')..>"
Run Code Online (Sandbox Code Playgroud)

这是我的查询的最后一位,其中包含"where in X in"子句:

...
left join genre_tag_band_join tj on hb.id = tj.band_id or ob.id = tj.band_id
left join genre_tags t on tj.genre_tag_id = t.id
inner join venues v on e.venue_id = v.id

where t.name IN @tagsParam...
Run Code Online (Sandbox Code Playgroud)

我像这样做一个Dapper电话

var shows = con.Query<Event, Band, Band, GenreTag, Venue, Event>(query, (e, hb, ob, gt, v) =>
{
    Event show;
    ...
    return e;
},
new { tagsParam = tagsArr}).AsQueryable();
Run Code Online (Sandbox Code Playgroud)

其中tagsArr是一个字符串[].

我得到例外:

{"42601:语法错误位于或附近\"$ 1 \""}

Sha*_*sky 24

在PostgreSQL中,你不能使用IN来检查一个值是否在数组中,你必须使用以下PostgreSQL特定的语法:where t.name = ANY (@tagsParam).请参阅PostgreSQL文档中的 8.15.5部分.

  • PostgreSQL支持IN,但不支持数组类型 - (1,2)不是数组类型.使用ANY语法,您可以尝试用括号括起@tagParam吗? (4认同)
  • 这很令人困惑,因为你通常希望Dapper将`(@array)`中的foo重写为`@ a1,@ a2,...)中的foo,但由于某些原因它不会对PostgreSQL执行此操作. (2认同)