2016-05-27 152 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)' –