$ select und $ expand break ODataQueryOptions - wie behebt man das?

Wir verwenden Microsoft ASP.NET MVC OData WebAPI für unsere Webdienste. Aufgrund einiger Probleme mit der Datenarchitektur im Zusammenhang mit der Hierarchie-ID (die außerhalb des Bereichs dieser Konversation liegen) müssen einige unserer GET-Vorgänge ODataQueryOptions verwenden und den Ausdruck manuell bearbeiten, um zusätzliche Einschränkungen hinzuzufügen. Wir tun dies wie folgt (Fehlerbehandlungscode entfernt und aus Gründen der Übersichtlichkeit Aufrufe an andere Methoden):

public IQueryable<Person> Get(ODataQueryOptions<Person> oDataQueryOptions)
{
    IQueryable<Person> result;
    IQueryable<Person> dataSet = context.Persons;

    var tempQuery = oDataQueryOptions.ApplyTo(dataSet).Cast<Person>();
    var modifier = new HierarchyNodeExpressionVisitor(GetDescendantsOfNode, GetAncestorsOfNode);
    var expression = modifier.ModifyHierarchyNodeExpression(tempQuery.Expression);

    result = context.Persons.Provider.CreateQuery<Person>(expression);

    return result;
}

Dies hat sich seit einiger Zeit bewährt, aber wir haben mit Spannung auf das Auswählen und Erweitern gewartet, damit wir die Daten, die wir von unseren Diensten erhalten, besser kontrollieren können. Am Montag haben wir unsere Entwicklungsumgebung auf WebApi OData 5.0.0-rc1 aktualisiert und die Funktion zum Auswählen und Erweitern aktiviert. Wir können sie jedoch nicht für Dienste verwenden, die ODataQueryOptions verwenden. Wir können es nur gegen unsere anderen Dienste verwenden. Wenn wir den obigen Code mit abfragen$select und / oder$expanderhalten wir den folgenden Fehler:

"message": "The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.",
"type": "System.InvalidOperationException",
"stacktrace": "",
"internalexception":
{
    "message": "Unable to cast the type 'System.Web.Http.OData.Query.Expressions.SelectAllAndExpand`1' to type 'OurCompany.Domains.Data.Models.Person'. LINQ to Entities only supports casting EDM primitive or enumeration types.",
    "type": "System.NotSupportedException",
    "stacktrace": " at System.Data.Objects.ELinq.ExpressionConverter.ValidateAndAdjustCastTypes(TypeUsage toType, TypeUsage fromType, Type toClrType, Type fromClrType) at System.Data.Objects.ELinq.ExpressionConverter.GetCastTargetType(TypeUsage fromType, Type toClrType, Type fromClrType, Boolean preserveCastForDateTime) at System.Data.Objects.ELinq.ExpressionConverter.CreateCastExpression(DbExpression source, Type toClrType, Type fromClrType) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.CastMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.Convert() at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator() at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.IEnumerable.GetEnumerator() at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteFeed(IEnumerable enumerable, IEdmTypeReference feedType, ODataWriter writer, ODataSerializerContext writeContext) at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders) at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.WebHost.HttpControllerHandler.d__10.MoveNext()"
}

Ich habe ein bisschen gegoogelt und bin darauf gestoßendiese unddiese, aber beide waren nicht hilfreich. Niemand scheint genau das zu tun, was wir tun, und versucht, Select-and-Expand zu verwenden. Wie beheben wir das? Ich bin hier ratlos ...

Antworten auf die Frage(1)

Ihre Antwort auf die Frage