아래 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
및 가져 오기 방법은 다음과 같습니다
무엇이 잘못되었는지 알려주세요.
'MessageType'은'enum'입니까? 'int'? '문자열'? 왜냐하면 내가 잘못 아니었다면 숫자를 문자열로 사용하기 때문입니다. 'https : // localhost : 44378/v1/RoutePrefix/Route? $ filter = Id eq 1234 and MessageType eq 1'을 사용하려고 시도하십시오. – cloudikka
MessageType은 string입니다. "또는"연산자를 사용하면이 작동합니다. "and"연산자를 사용하면 결과가 없습니다. – Kumaraguru
해결 된 문제. $ filter 시스템 쿼리 옵션을 사용하면 클라이언트가 요청 URL로 해결되는 리소스 모음을 필터링 할 수 있습니다. $ filter로 지정된 표현식은 콜렉션의 각 자원에 대해 평가되고 표현식이 참으로 평가되는 항목 만 응답에 포함됩니다. 표현식이 false 또는 null로 평가되는 리소스 또는 사용 권한으로 인해 사용할 수없는 참조 속성은 응답에서 생략됩니다. 최종 컬렉션에는 쿼리 문자열에 전달 된 원래 값이 없습니다. 그것은 다른 값으로 대체된다. – Kumaraguru