2016-05-27 50 views
2

複数の検索条件に対して動的なSqlクエリを作成しようとしています。私は一般的にビルダーの使い方を理解していますが、実際には@termが毎回違っている必要があるので、ループで何をすべきか分かりません。クエリだけでなく、匿名型も一致させる必要があります。Dapper.SqlBuilderとOrWhereを使用して動的SQLクエリを作成する方法

クエリ文字列に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

あるクエリの構築を行うための一つの方法です。私は、パラメータが辞書であることを最初に理解できませんでした。

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); 
    } 
... 
} 
+0

ご質問ありがとうございます。ちょっとしたコメント。 string.Formatは非効率的です。 'term + i.ToString()'または 'string.Format(" term {0} "、i)'を使用して、 –

関連する問題