4

複数の検索語に対して動的な SQL クエリを作成しようとしています。ビルダーの一般的な使用方法は理解していますが、@term を毎回異なるものにする必要があるため、ループで何をすべきかわかりません (と思います)。クエリだけでなく、匿名型でも一致します。

クエリ文字列で string.Format を使用できますが、匿名型で一致させる方法がわかりませんか?

public async Task<List<Thing>> Search(params string[] searchTerms)
{
    var builder = new SqlBuilder();
    var template = builder.AddTemplate("SELECT * /**select**/ from ThingTags /**where**/ ");

    for (int i = 0; i < searchTerms.Length; i++)
    {
        builder.OrWhere("value LIKE @term", new { term = "%" + searchTerms[i] + "%" });
    }
...
}

現在のフォームでは、用語「abc」「def」「ghi」に対して作成されるクエリは次のとおりです。

CommandType: Text, CommandText: SELECT *  from ThingTags WHERE  ( value LIKE @term OR value LIKE @term OR value LIKE @term ) 

Parameters:
Name: term, Value: %ghi%
4

2 に答える 2

8

さて、ここでクエリの構築を行う 1 つの方法を示します。パラメータがディクショナリである可能性があることに最初は気づきませんでした。

public async Task<List<Thing>> Search(params string[] searchTerms)
{
var builder = new SqlBuilder();
var template = builder.AddTemplate("SELECT * /**select**/ from ThingTags /**where**/ ");

    for (int i = 0; i < searchTerms.Length; i++)
    {
        var args = new Dictionary<string, object>();
        var termId = string.Format("term{0}", i.ToString());
        args.Add(termId, "%" + searchTerms[i] + "%");
        builder.OrWhere("value LIKE @" + termId, args);
    }
...
}
于 2016-05-27T16:25:39.780 に答える