2016-08-04 27 views
0

Dapperを使用して3つの値を渡して結果を取得したいが、そのクラスの他の属性は自動的にnull値をとり、それらのパラメータを無視したい。 今、私はparam1と言う結果を得ようとしています。しかしPARAM2とparam3Dapperでnull値のパラメータを除外する関数またはメソッド

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

whereConditionsとしての私のオブジェクトはPARAM1、PARAM2とparam3を持つオブジェクトです。しかし、結果の使用where句の値を持っているのparamからはやヌル

を無視

私はユーザー名またはスクリーンを受け取ることになります場合は、[UPDATE]

クエリUIから今

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

、私はわかりませんまたはアクション。私は3人すべてのうちの1人を得ることができます。私のクエリは、私がanonymusオブジェクト

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

を作成する場合、それはうまく動作しますが、私は

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

としてそれを渡す必要があり、他のパラメータの場合、だから私は理解する必要が応じ

を変更する必要がありますどのように匿名オブジェクトを条件として渡すことができますか。

・ホープ、このヘルプ

+0

どのdapperプラグインをお使いですか?私が知る限り、DapperにはCRUDメソッドは含まれていません。 –

+0

私は質問を修正しました。助けてくれますか? @AlexKrupka –

+0

'クエリステートメント'はどのように見えますか? – christiandev

答えて

0

(ブランクの基準値は、常にこれらの値は、UIフォームから発生するケースが一般的である、無視することができた場合にのみ動作します)一つの簡単な方法は、常にすべての3つの引数を渡すことであろう空白の値をスキップする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 ?? "" 
    } 
); 

空白/ nullかなかったかどうかに、すべての3つの値を渡します。

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); 
関連する問題