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 示例中,它找不到第二个参数。

4

1 回答 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 中使用 Raw SQL,但如果您使用类型化 API,它会更加简洁和可移植。例如:

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

[Alias]如果您的表与 POCO 的名称不同,您也可以使用,并且还可以指定[Schema]with:

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

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

于 2013-02-13T21:26:19.533 回答