Tags (Id, Name) という名前のデータベース テーブルがあり、そこから名前がリスト内の名前と一致するものを選択したいと考えています。SQL では次のようなものを使用します。
Select * from Tags Where Name In ('Name1', 'Name2', 'xxx...)
しかし、現在、ASP.Net MVC3 プロジェクトで PetaPoco を使用しているのですが、適切な方法を見つけられずに困っています。これまでに試したことは次のとおりです。
var tagsToFind = new string[] { "SqlServer", "IIS" };
var sql = PetaPoco.Sql.Builder.Select("*").From("Tags").Where("Name in (@0)", tagsToFind);
var result = db.Query<Tag>(sql);
結果は次のSQLになります。最初のものだけtagsToFind リスト内の名前は、すべてのデータではなく、テーブル データを一致させるために使用されます。
SELECT * FROM Tags WHERE (Name in (@0)) -> @0 [String] = "SqlServer"
おそらくそれほど難しいことではないとわかっているので、少しイライラします。どんな助けでもありがたいです!
アップデート:別の方法でもできることがわかった
var sql = PetaPoco.Sql.Builder.Append("Select * from tags Where Name IN (@0", tagNames[0]);
foreach (string tagName in tagNames.Where(x => x != tagNames[0])) {
sql.Append(", @0", tagName);
}
sql.Append(")");
var result = db.Query<Tag>(sql)
これにより、sqlparameters を使用しながら、必要な結果が得られます。非常にきれいというわけではありませんが、今のところはこれで十分だと思います。
/マイク
ベストアンサー1
これは動作しますが、@0 (序数) 構文は使用できません。名前付きパラメータを使用する必要があります。そうしないと、個別のパラメータであると認識されます。
var tagsToFind = new string[] { "SqlServer", "IIS" };
var sql = PetaPoco.Sql.Builder.Select("*").From("Tags").Where("Name in (@tags)", new { tags = tagsToFind });
var result = db.Query<Tag>(sql);
その結果、
select * from Tags where name in (@0, @1);
@0 = SqlServer, @1 = IIS