Dapper和In Condition

17

使用Dapper时,以下代码会抛出Incorrect syntax near ','的异常。

const string sql = 
    "select * from ZipToZipDistance z where z.NoRouteFound = 0" +
    " and z.OriginZip in (@zips) or z.DestZip in (@zips)";
var zipStrings = zips.Select(x => x.ToString()).ToArray();
var result = connection.Query<ZipToZipDistance>(sql, 
    new { zips = zipStrings });

哦,SQL中没有逗号。这一定与参数有关。 OriginZipDestZipvarchar(10)类型的。 zipsIEnumerable<int>类型的。我尝试使用未转换为字符串的 zips 作为参数。但是出现了相同的错误。

看起来非常简单。我做错了什么?


4
去掉@zips中的括号。 - jaxxbo
刚刚遇到了同样的问题,我刚刚删除了@zips周围的括号。就像jaxxbo说的那样。 - Bjørn Fridal
1个回答

16

尝试:

const string sql = 
    "select * from ZipToZipDistance z where z.NoRouteFound = 0" +
    " and z.OriginZip in @zips or z.DestZip in @zips";
var zipStrings = zips.Select(x => x.ToString());
var result = connection.Query<ZipToZipDistance>(sql, 
    new { zips = zipStrings });

Sam,我遇到的问题是在IN子句中只能传递2100个项,这似乎是Dapper的限制,因为当我使用字符串拼接构造查询时它可以正常工作。这就是我的意思:有效代码: var query = @"SELECT * FROM QuestionTags WHERE QuestionID IN (" + idsCsvString + ")"; var results = conn.Query<QuestionTag>(query).ToList(); - Marko
当我按照你的建议操作时,出现了以下错误:传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。在此 RPC 请求中提供了太多的参数。最大值为 2100。 - Marko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接