2017-12-28 32 views
-1

아래 get 요청을 처리하는 단일 GET 조치로 Web API를 작성합니다.Web Api에서 "and"연산자가 작동하지 않는 OData 필터

https://localhost:44378/v1/RoutePrefix/Route GET? $ 필터 = 아이디 EQ '1234'$ = 이름을 선택이

https://localhost:44378/v1/RoutePrefix/Route GET (이 잘 작동)? $ 필터 = 아이디 EQ '1234'또는 메세지 유형 EQ '1'(이 잘 작동합니다)

https://localhost:44378/v1/RoutePrefix/Route GET? $ 필터 = 이드 당량 '1234'와 메세지 유형 당량 '1'(이 작동하지 않는다. 응답 값은 항상 [])

는 함께 필터 "및"운전자는 마치 작동 안함. "또는"연산자가 나를 위해 잘 작동합니다.

내 webapiconfig.cs에는 아래 코드가 있습니다.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 
     config.MapODataServiceRoute("odata", "v1/RoutePrefix", GetEdmModel(), new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer)); 
     config.Count().Filter().OrderBy().Expand().Select().MaxTop(null); 
    } 
    private static IEdmModel GetEdmModel() 
    { 
     ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.Namespace = "Default"; 
     builder.ContainerName = "DefaultContainer"; 
     builder.EntitySet<Model>("Route"); 
     builder.EntitySet<Model>("Route").EntityType.Filter(nameof(Model.Id)); 
     builder.EntitySet<Model>("Route").EntityType.Filter(nameof(Model.MessageType)); 
     var edmModel = builder.GetEdmModel(); 

     return edmModel; 
    } 
} 

내 컨트롤러에서 필터 매개 변수의 수를 기반으로 다른 방법을 호출합니다. 그리고 두 메소드 모두 GET 메소드에 대한 응답으로 List를 리턴합니다. Main get 메서드에서 나는 Ok (List.AsQueryable())로 리턴한다.

나는 속성 [EnableQuery]와 컨트롤러를 장식 아래 ODataController 구현 :

는 [EnableQuery] 공용 클래스 RouteController :

public IHttpActionResult Get() 
{ 
     List<Model> response = null; 
     string cacheKey = string.Empty; 
     var queryString = Request.RequestUri.PathAndQuery.Replace("/v1/RoutePrefix", ""); 
     var queryTokens = ParseQueryString(EdmModel, queryString); 

     if (queryTokens == null || queryTokens.Any(a => string.IsNullOrWhiteSpace(a.Value)) || !queryTokens.ContainsKey(Constants.Id)) 
     { 
      IList<ApiError> errors = new List<ApiError>() { new ApiError(Constants.InvalidQueryStringErrorCode, Constants.InvalidQueryStringErrorMessage) }; 
      return GenerateResponse(Request, HttpStatusCode.BadRequest, errors, null); 
     } 
     else 
     { 
      try 
      { 
       if (queryTokens.ContainsKey(Constants.MessageType)) 
       { 
        response = GetConfigurationByMessageTypeAndId(queryTokens); 
       } 
       else 
       { 
        response = GetConfigurationById(queryTokens); 
       } 
      } 
      catch (Exception ex) 
      { 
       var apiError = Utilities.CreateApiError(Constants.InternalServerError, Constants.InternalServerErrorMessage, null, null, null); 
       IList<ApiError> apiErrors = new List<ApiError> { apiError }; 

       return GenerateResponse(Request, HttpStatusCode.InternalServerError, apiErrors, null); 
      } 

      if (response.Count > 0) 
      { 
       return Ok(response.AsQueryable()); 
      } 
      else 
      { 
       return NotFound(); 
      } 
     } 
    } 
: ODataController

및 가져 오기 방법은 다음과 같습니다

무엇이 잘못되었는지 알려주세요.

+0

'MessageType'은'enum'입니까? 'int'? '문자열'? 왜냐하면 내가 잘못 아니었다면 숫자를 문자열로 사용하기 때문입니다. 'https : // localhost : 44378/v1/RoutePrefix/Route? $ filter = Id eq 1234 and MessageType eq 1'을 사용하려고 시도하십시오. – cloudikka

+0

MessageType은 string입니다. "또는"연산자를 사용하면이 작동합니다. "and"연산자를 사용하면 결과가 없습니다. – Kumaraguru

+0

해결 된 문제. $ filter 시스템 쿼리 옵션을 사용하면 클라이언트가 요청 URL로 해결되는 리소스 모음을 필터링 할 수 있습니다. $ filter로 지정된 표현식은 콜렉션의 각 자원에 대해 평가되고 표현식이 참으로 평가되는 항목 만 응답에 포함됩니다. 표현식이 false 또는 null로 평가되는 리소스 또는 사용 권한으로 인해 사용할 수없는 참조 속성은 응답에서 생략됩니다. 최종 컬렉션에는 쿼리 문자열에 전달 된 원래 값이 없습니다. 그것은 다른 값으로 대체된다. – Kumaraguru

답변

0

이슈 resolved.The $ 필터 시스템 쿼리 옵션

덕분에 클라이언트가 요청 URL에 의해 해결 된 자원의 컬렉션을 필터링 할 수 있습니다. $ filter로 지정된 표현식은 콜렉션의 각 자원에 대해 평가되고 표현식이 참으로 평가되는 항목 만 응답에 포함됩니다. 표현식이 false 또는 null로 평가되는 리소스 또는 사용 권한으로 인해 사용할 수없는 참조 속성은 응답에서 생략됩니다. 최종 컬렉션에는 쿼리 문자열에 전달 된 원래 값이 없습니다. 다른 값으로 대체됩니다 - Kumaraguru 1 분 전 편집