2017-06-28 6 views
1

私はそれがとてもDapper.net

var filter = new Filter 
{ 
    ThingID = 1, 
    Keywords = new[] { "op", "s" } 
}; 

のように移入されたフィルタオブジェクトを持っています。そして、このようなクエリ構築することができるようにしようとしている:

var sb = new StringBuilder(); 
sb.AppendLine("select * from Stuff where 1=1"); 
if (filter.ThingID.HasValue) 
{ 
    sb.AppendLine(" and ThingID = @ThingID"); 
} 
if (filter.Keywords != null) 
{ 
    for (int i = 0; i < filter.Keywords.Length; i++) 
    { 
     string keyword = filter.Keywords[i]; 
     if (!string.IsNullOrWhiteSpace(keyword)) 
     { 
      sb.AppendLine(" and (Model like '%' || @Keywords" + i + " || '%')"); 
     } 
    } 
} 
var sql = sb.ToString(); 
var results = Query<Stuff>(sql, filter).ToList(); 

これは、ThingID小道具だけが入力されていればうまく動作しますが、Dapperがどのような方法でもキーワードとしてパラメータを入力していないことがわかります。これはDapperでも可能ですか?「@ Keywordsのキーワード」のコンテキストでのみ動作しますか?

答えて

2

パラメータは名前で一致する必要があります。 @Keywords17のようなパラメータを追加していますが、追加するプロパティはKeywords17ではありません。 Keywords[17]と解釈されません。 フラットアレイの自動拡張機能ですが、これは拡張のためのものですin @Keywords(拡張自体はinに固有ではありません)。現在、あなたに自動的に役立つものはありません。私の代わりにDynamicPaametersを示唆している:

var args = new DynamicParameters(); 
args.Add("ThingID", 1); 
... 
if (!string.IsNullOrWhiteSpace(keyword)) 
{ 
    sb.AppendLine(" and (Model like '%' || @Keywords" + i + " || '%')"); 
    args.Add("Keywords" + i, keyword); 
} 
... 
var cmd = new CommandDefinition(sql, args, flags: CommandFlags.NoCache); 
var results = Query<Stuff>(cmd).AsList(); 

ノートをここで終わりに微妙な二つの変更 - CommandFlags.NoCacheあなたがアイテム単位の削減にこれを支払うことを選択するかもしれませんが(似ていますが、異なるSQLのルックアップエントリの宅地分譲を防ぐことができますコスト、あなた次第)。 ToListの代わりにAsListを指定すると、余分なリストの割り当てが行われなくなります。

関連する問題