2014-05-13 56 views
3

我想寫一個帶動態參數列表的查詢(取決於參數是否設置)。 我想使用dapper在oracle數據庫上執行查詢。用小巧的動態參數化查詢

示例代碼:

 var sqlParams = new List<object>(); 
     var sqlBuilder = new StringBuilder(); 
     sqlBuilder.Append("SELECT * FROM EXAMPLE WHERE 1 = 1 "); 

     if (!string.IsNullOrEmpty(aParam)) 
     { 
      sqlBuilder.Append(" AND A LIKE ?"); 
     } 

     if (!string.IsNullOrEmpty(bParam)) 
     { 
      sqlBuilder.Append(" AND B LIKE ? "); 
     } 

     var sql = sqlBuilder.ToString(); 

     return this.Connection.Query<Equipment>(
      sql, 
      new { aParam, bParam } // ?? 
      ).ToList(); 

回答

2

小巧玲瓏只有真正用於指定的參數。我似乎記得,在Oracle他們是冒號前綴,那麼:

if (!string.IsNullOrEmpty(aParam)) 
{ 
    sqlBuilder.Append(" AND A LIKE :aParam"); 
} 

if (!string.IsNullOrEmpty(bParam)) 
{ 
    sqlBuilder.Append(" AND B LIKE :bParam"); 
} 

現在您現有的代碼在這裏:

return this.Connection.Query<Equipment>(
    sql, 
    new { aParam, bParam } 
    ).ToList(); 

應該工作。 Dapper使用匿名類型成員的名稱作爲參數名稱。它還包含一些非常基本的代碼來檢查是否有任何給定的成員不存在於sql中,因此如果您的sql 提到:bParam,它實際上不會將aParam值添加爲參數。

在更復雜的場景中,還有一個可以使用的對象,它的功能更像是一本字典 - 但在這裏您不需要。

+0

如何在第二個片段中動態添加aParam,bParam?是否可以用'ExpandoObject'替換'new {aParam,bParam}'?我不想對'aParam,bParam'進行硬編碼。我想通過循環添加它們。好像查詢()不支持ExpandoObject作爲它的第二個參數。 – kkuilla

+0

@kkuilla你可以使用'DynamicParameters',或者坦率地說你可以只傳遞兩個參數(dapper將忽略任何*明顯*不被使用) –

+0

Yes,'DynamicParameters'工作出色。謝謝.... – kkuilla