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 の例のように、匿名クラスを使用してパラメーターをリストしようとすると、2 番目のパラメーターが見つかりません。

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 で生の SQL を使用する必要はありませんが、代わりに型付き API を使用すると、より簡潔で移植性が高くなります。例えば:

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

[Alias]テーブルが POCO と同じ名前ではなかった場合にも使用でき、次のように指定することもできます[Schema]

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

データベースをクエリするときに、代わりに指定されたスキーマとテーブル名を使用します。

于 2013-02-13T21:26:19.533 に答える