以下のget要求を処理する単一のGETアクションでWeb Apiを作成します。"and"演算子がWeb Apiで動作していない "and"演算子を持つデータフィルタ
= IdがEQ '1234' またはのMessageTypeをhttps://localhost:44378/v1/RoutePrefix/Route?$フィルターをGET(この1つは正常に動作します)名前= $選択
をhttps://localhost:44378/v1/RoutePrefix/Route?$フィルタ= IdがEQ '1234' をGET EQ '1'(これは正常に動作します)
がhttps://localhost:44378/v1/RoutePrefix/Route GET?$フィルタ= IdがEQ '1234' とMessageTypeのEQ '1'(これは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を: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();
}
}
}
を
間違っていることを教えてください。
'MessageType'は' enum'ですか? 'int'? 'string'ですか?私は間違っていない場合は、文字列として数値を使用しているため。 'https:// localhost:44378/v1/RoutePrefix/Route?$ filter = Id eq 1234とMessageType eq 1'を使用してください。 – cloudikka
MessageTypeは文字列です。私は "または"演算子を使用する場合、これは動作します。私は "and"演算子を使うと結果が得られません。 – Kumaraguru
問題を解決しました。$ filterシステムクエリオプションを使用すると、クライアントは要求URLによってアドレス指定されるリソースのコレクションをフィルタリングできます。 $ filterで指定された式は、コレクション内の各リソースについて評価され、式が真と評価される項目だけがレスポンスに含まれます。式がfalseまたはnullに評価されるリソース、またはアクセス許可のために使用できない参照プロパティは、response.Myの最終コレクションにはクエリ文字列で渡された元の値を持っていなかったから省略されます。異なる値に置き換えられます – Kumaraguru