2016-08-04 1 views
0

Dapper를 사용하여 세 개의 값을 전달하고 그 결과에 따라 결과를 가져 오려면 해당 클래스의 다른 속성이 자동으로 null 값을 가져오고 해당 매개 변수를 무시하고 싶습니다. 이제 param1을 말하고 결과를 얻으려고합니다. 그러나 PARAM2 및 3 당겨Dapper에서 null 값을 갖는 매개 변수를 제외하는 함수 또는 메소드

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

whereConditions로 내 목적은 PARAM1, PARAM2 및 3 당겨와 객체입니다. 그러나 결과 사용 where 절 값이 PARAM에서은과 널

을 무시

내가 아이디 또는 화면을받을 경우 [업데이트]

를 조회 UI에서 지금

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

, 나는 확실하지 않다 또는 조치. 나는이 세 사람 중 하나를 얻을 수 있습니다. 내 쿼리 내가 그것은 내가

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

로 그래서 내가 이해할 필요가 통과해야 잘하지만 다른 매개 변수의 경우에는 작동

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

anonymus 개체를 만드는 경우 그에 따라

을 변경할 수있다 어떻게 익명 객체를 조건으로 전달할 수 있습니까?

희망이 도움

+0

어떤 dapper 플러그인을 사용하고 있습니까? 내가 아는 한 Dapper에는 CRUD 메소드가 포함되어 있지 않다. –

+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)가 그리고 당신은 당신이, 물론, 단순히 호출 할 수있는 널 (null)/빈 값이 다음 무시하려는 경우

var data = GetData(request.UserName, request.Screen, request.LogAction); 
관련 문제