使用自定义查询选择ID存在于ID列表中的项目

6
在Dapper中,您可以执行以下操作:
var items = connection.Query<Items>("SELECT * FROM `@database`.`table`  WHERE `id` IN @idList;", new {database = DatabaseName, idList = someList.Select(n => n.id)});

尝试在ormlite中做同样的事情:
var items = connection.Query<Items>("SELECT * FROM {0}`.`table`  WHERE `id` IN {1};", DatabaseName, someList.Select(n => n.id)});

返回一个错误。Dapper创建查询如下:

SELECT * FROM `someDB`.`table` WHERE `id` IN (1,2,3,4);

其中ORMlite生成:

SELECT * FROM `someDB`.`table` WHERE `id` IN [1,2,3,4];

在MySQL中,方括号是无效的。在ormlite中是否可以实现这个功能?

当我尝试使用匿名类列出参数(如dapper示例中),它找不到第二个参数。


1
实际上,Dapper将查询创建为IN (@idList0, @idList1, @idList2)...只是这样说而已 ;) 但这听起来像是@Mythz的问题... - Marc Gravell
1个回答

6
为了执行一个 SQL IN 语句,OrmLite 需要能够在需要时转义所有值(即如果它们是字符串值)。因此,如果在 OrmLite 中使用原始 SQL,则可以执行以下操作:
var ids = someList.Select(n => n.id).ToArray();

var items = db.Select<Items>(
    "SELECT * FROM `{0}`.`table`  WHERE `id` IN ({1})", 
    DatabaseName, new SqlInValues(ids));

虽然在OrmLite中大部分时候你不需要使用原始SQL,但如果你使用类型API的话更加简洁和可移植。例如:

var items = db.Select<Items>(q => Sql.In(q.Id, ids));

如果您的表名与 POCO 名称不同,您也可以使用 [Alias],并且还可以通过以下方式指定 [Schema]

[Schema("DatabaseName")]
[Alias("table")]
public class Items 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

查询数据库时,将使用指定的模式和表名。


嗨mythz,我重写了代码,并且现在正在使用typed API。然而,我使用"Sql.In"语句时遇到了问题。它仍会在int collection周围放置方括号。如果我先将collection转换为<string>,则问题不会发生。这是预期的行为还是使用MySQL时的问题? - Chris W
嗯,一定是个bug。你能否在GitHub上发布一个问题,并提供一个小片段以便我们跟踪它? - mythz

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