Фильтр OData с оператором "и" не работает в Web Api

Я создаю Web Api с одним действием GET, которое обрабатывает приведенные ниже запросы get.

GET https://localhost:44378/v1/RoutePrefix/Route? $ Filter=Id eq '1234'$select=Name (Этот работает нормально)

GET https://localhost:44378/v1/RoutePrefix/Route? $ Filter = Id eq '1234' или MessageType eq '1' (это работает нормально)

GET https://localhost:44378/v1/RoutePrefix/Route? $ Filter = Id eq '1234' и MessageType eq '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;
    }
}

А в моем контроллере, исходя из количества параметров фильтра, я вызываю другой метод. И оба метода возвращают List в качестве ответа на метод GET. В методе Main get я возвращаю как Ok(List.AsQueryable()).

Я украсил контроллер атрибутом [EnableQuery] и реализовал ODataController, как показано ниже:

[EnableQuery] открытый класс RouteController: ODataController

и метод Get выглядит так:

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();
            }
        }
    }

Пожалуйста, дайте мне знать, что я делаю не так.

Спасибо

1 ответ

Устранена проблема. Параметр системного запроса $filter позволяет клиентам фильтровать коллекцию ресурсов, к которым обращается URL-адрес запроса. Выражение, указанное с помощью $filter, оценивается для каждого ресурса в коллекции, и в ответ включаются только те элементы, для которых выражение имеет значение true. Ресурсы, для которых выражение оценивается как ложное или нулевое, или ссылки на свойства, которые недоступны из-за разрешений, опущены в ответе. Моя конечная коллекция не имела исходного значения, переданного в строке запроса. Он заменяется другим значением - Кумарагуру 1 минуту назад редактировать

Другие вопросы по тегам