asp.net odata web api $ выберите сбой для связанных объектов

1

Мои сущности

public class A
{
    public int id {get;set;}
    public string Name {get;set;}
    public List<B> b {get;set;}
}
public class B
{
    public string C {get;set;}
    public string D {get;set;}
}

My controller class
[RoutePrefix("odata/A/{id}")]
[ODataRouting]
public class AsController : ApiController
{
    [Queryable]
    public async Task<HttpResponseMessage> GetA(int id)
    {
        // here i call another method that gives me List<A> result
        HttpResponseMessage httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK, result);
        return httpResponseMessage;

    }
}

WebApiConfig.cs
 public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Filters.Add(new ValidationActionFilter());

        // Web API configuration and services
        config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling =
        TypeNameHandling.Objects;

        var contractResolver = (config.Formatters.JsonFormatter.SerializerSettings.ContractResolver as DefaultContractResolver);
        contractResolver.IgnoreSerializableAttribute = true;

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );



        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<A>("As");
        builder.EntitySet<B>("b");

        config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
        }
    }

Когда я запускаю query/odata/A/1? $ Select = Name, я получаю json только с одним полем Name. Но когда я запускаю query/odata/A/1? $ Select = b, я получаю вывод с исключением

{ 
    "$type":"System.Web.Http.HttpError, System.Web.Http",
    "Message":"The query specified in the URI is not valid.",
    "ExceptionMessage":"Could not find a property named 'b' on type 'A'.",
    "ExceptionType":"Microsoft.Data.OData.ODataException",
    "StackTrace":"   at Microsoft.Data.OData.Query.SyntacticAst.SelectPathSegmentTokenBinder.ConvertNonTypeTokenToSegment(PathSegmentToken tokenIn, IEdmModel model, IEdmEntityType entityType)
       at Microsoft.Data.OData.Query.SyntacticAst.SelectPropertyVisitor.ProcessTokenAsPath(NonSystemToken tokenIn)
       at Microsoft.Data.OData.Query.SyntacticAst.SelectPropertyVisitor.Visit(NonSystemToken tokenIn)
       at Microsoft.Data.OData.Query.SyntacticAst.NonSystemToken.Accept(IPathSegmentTokenVisitor visitor)
       at Microsoft.Data.OData.Query.SyntacticAst.SelectBinder.Bind(SelectToken tokenIn)
       at Microsoft.Data.OData.Query.SelectExpandSemanticBinder.Parse(IEdmEntityType elementType, IEdmEntitySet entitySet, ExpandToken expandToken, SelectToken selectToken, ODataUriParserConfiguration configuration)
       at Microsoft.Data.OData.Query.ODataUriParser.ParseSelectAndExpandImplementation(String select, String expand, IEdmEntityType elementType, IEdmEntitySet entitySet)
       at Microsoft.Data.OData.Query.ODataUriParser.ParseSelectAndExpand(String select, String expand, IEdmEntityType elementType, IEdmEntitySet entitySet)
       at System.Web.Http.OData.Query.SelectExpandQueryOption.get_SelectExpandClause()
       at System.Web.Http.OData.Query.Validators.SelectExpandQueryValidator.Validate(SelectExpandQueryOption selectExpandQueryOption, ODataValidationSettings validationSettings)
       at System.Web.Http.OData.Query.SelectExpandQueryOption.Validate(ODataValidationSettings validationSettings)
       at System.Web.Http.OData.Query.Validators.ODataQueryValidator.Validate(ODataQueryOptions options, ODataValidationSettings validationSettings)
       at System.Web.Http.OData.Query.ODataQueryOptions.Validate(ODataValidationSettings validationSettings)
       at System.Web.Http.QueryableAttribute.ValidateQuery(HttpRequestMessage request, ODataQueryOptions queryOptions)
       at System.Web.Http.QueryableAttribute.ExecuteQuery(Object response, HttpRequestMessage request, HttpActionDescriptor actionDescriptor)
       at System.Web.Http.QueryableAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)"
}

Пожалуйста, предложите любое решение этой проблемы.

благодаря

Теги:
asp.net-web-api-odata

2 ответа

1
Лучший ответ

Нашел проблему. В моем действительном коде C и D являются полями, а не свойствами.

Изменение их свойств позволило решить проблему.

  • 0
    мой контроллер, который возвратил класс DTO, не работал, потому что у меня были поля вместо свойств, спасибо за обмен !!
0

HJ,

Попробуйте следующее...

/odata/A(1)?$select=b&$expand=b

Надеюсь это поможет,

Эд Мендес

Ещё вопросы

Сообщество Overcoder
Наверх
Меню