以下の取得リクエストを処理する単一の GET アクションで Web Api を作成しています。
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' and MessageType eq '1' (これは機能していません。応答値は常に [] です)
「and」演算子を使用したフィルターが機能していないようです。「または」演算子は私にとってはうまく機能します。
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 を返します。メインの get メソッドでは、Ok(List.AsQueryable()) として返します。
[EnableQuery] 属性でコントローラーを装飾し、以下のように ODataController を実装しました。
[EnableQuery] public class 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();
}
}
}
何が間違っているのか教えてください。
ありがとう