カスタムクエリを使用してIDのリスト内にIDが存在するアイテムを選択する

c# dapper mysql ormlite-servicestack

質問

あなたは次のようなことができます:

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番目のパラメータを見つけることができません。

受け入れられた回答

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));

表がPOCOと同じ名前でない場合は[Alias]使用することもできます。また、 [Schema]を次のように指定することもできます。

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

代わりに、dbを照会するときに指定されたスキーマとテーブル名を使用します。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow