2016-08-04 66 views
0

我想傳遞三個值並根據使用Dapper的結果獲取結果,但該類中的其他屬性會自動取空值,並且我想忽略這些參數。 現在我只是通過說param1並試圖獲得結果。然而我的對象爲param2和param3在Dapper中排除空值參數的函數或方法

connection.Query<T>("Query statement", whereConditions) 

whereConditions是帶有參數1,參數2和參數3的對象。然而,結果使用where子句從PARAM具有價值,而忽略了零點

[更新]

查詢

select ID, UserName, Screen, Url, LogAction from LogTable 
Where UserName = 'Joe' and Screen = 'edit' and LogAction = 'delete' 

現在從UI,我不知道我是否會收到用戶名或屏幕或行動。我可以得到他們三人中的任何一人。我查詢了。如果我創建一個anonymus對象

var whereConditions = new { UserName = "Joe", Screen = "edit" } 

它運作良好,但在其他參數的情況下,我需要把它作爲

var whereConditions = new { UserName = "Joe", Screen = "edit", LogAction = "save" } 

所以我需要了解相應地改變

如何將匿名對象作爲條件傳遞。

希望這有助於

+0

你在用什麼小巧的插件?據我所知Dapper沒有包含增刪改查方法 –

+0

我已經在這個問題上做了修正。它有幫助嗎? @AlexKrupka –

+0

「查詢語句」是什麼樣的? – christiandev

回答

0

一個簡單的方法(如空白的標準值總是可以忽略不計,這是常見的,當這些值從UI形式發起的情況下它只會工作)將始終通過所有三個參數但要構造一個跳過空值的WHERE子句 - 例如。

select ID, UserName, Screen, Url, LogAction 
from LogTable 
Where (@UserName = '' or UserName = @UserName) 
and (@Screen = '' or Screen = @Screen) 
and (@LogAction = '' or LogAction = @LogAction) 

,那麼你會如果你包裹這個了可選參數,如該方法中通過所有三個值,而不管他們是否是空/空或不

return conn.Query<Result>(
    @" 
     select ID, UserName, Screen, Url, LogAction 
     from LogTable 
     Where (@UserName = '' or UserName = @UserName) 
     and (@Screen = '' or Screen = @Screen) 
     and (@LogAction = '' or LogAction = @LogAction) 
    ", 
    new 
    { 
     UserName = userName?? "", 
     Screen = screen ?? "", 
     LogAction = logAction ?? "" 
    } 
); 

private IEnumerable<Result> GetData(
    string userName = null, 
    string screen = null, 
    string logAction = null) 
{ 
    using (var conn = GetConnection()) 
    { 
     return conn.Query<Result>(
      @" 
       select ID, UserName, Screen, Url, LogAction 
       from LogTable 
       Where (@UserName = '' or UserName = @UserName) 
       and (@Screen = '' or Screen = @Screen) 
       and (@LogAction = '' or LogAction = @LogAction) 
      ", 
      new 
      { 
       UserName = userName ?? "", 
       Screen = screen ?? "", 
       LogAction = logAction ?? "" 
      } 
     ); 
    } 
} 

然後,你可以使調用代碼看起來很自然的不同數量的參數 - 例如。

var joeData = GetData(userName: "Joe"); 
var joeEditData = GetData(userName: "Joe", screen: "save"); 

然而,如果你的請求總是有三個值(用戶名,屏幕和logAction)只想和你要那麼忽略空/空值就可以了,當然,只需撥打

var data = GetData(request.UserName, request.Screen, request.LogAction);