当我在odata WebApi

时间:2016-07-18 14:25:21

标签: asp.net-web-api2 odata

我有一个看起来像(它是荷兰语)的complexType

namespace Omnisoft.Domain.ComplexTypes
{
//  <ComplexType> _[KnownType(typeof(Adres))]
[DataContract(IsReference = false, Namespace = "")]
[XmlInclude(typeof(Adres))]
public class Adres
{
    public Adres()
    {
        AdresLijn1 = "";
        AdresLijn2 = "";
        PostCode = "";
        Gemeente = "";
        Land = "BE";
        // "BE"

        //<Client_Adres_AdresLijn1></Client_Adres_AdresLijn1>
        //<Client_Adres_AdresLijn2></Client_Adres_AdresLijn1>

    }

    [DataMember(), StringLength(50, ErrorMessageResourceName = "StringMaxLength", ErrorMessageResourceType = typeof(ValRes.ValidationStrings))]
    [Display(Description="AdresLijn1", ResourceType = typeof(ViewRes.Address))]
    public string AdresLijn1 { get; set; }

    [DataMember(), StringLength(50, ErrorMessageResourceName = "StringMaxLength", ErrorMessageResourceType = typeof(ValRes.ValidationStrings))]
    [Display(Description="AdresLijn2", ResourceType = typeof(ViewRes.Address))]
    public string AdresLijn2 { get; set; }

    [DataMember(), StringLength(10, ErrorMessageResourceName = "StringMaxLength", ErrorMessageResourceType = typeof(ValRes.ValidationStrings))]
    [Display(Description="PostCode", ResourceType = typeof(ViewRes.Address))]
    public string PostCode { get; set; }
    [DataMember(), StringLength(50, ErrorMessageResourceName = "StringMaxLength", ErrorMessageResourceType = typeof(ValRes.ValidationStrings))]
    [Display(Description="Gemeente", ResourceType = typeof(ViewRes.Address))]
    public string Gemeente { get; set; }


    [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ValRes.ValidationStrings))]
    [DataMember(), StringLength(2, ErrorMessageResourceName = "StringMaxLength", ErrorMessageResourceType = typeof(ValRes.ValidationStrings))]
    [Display(Description="Land", ResourceType = typeof(ViewRes.Address))]
    public string Land { get; set; }

    [IgnoreDataMember]
    public string ToSingleLine
    {
        get
        {
            if (string.IsNullOrEmpty(AdresLijn2))
            {
                return string.Format("{0} {1} {2}", AdresLijn1, PostCode, Gemeente);
            }
            else
            {
                return string.Format("{0}({1}) {2}", AdresLijn1, AdresLijn2, PostCode, Gemeente);
            }
        }
    }

}

我现在没有在任何地方定义它(从modelbuilder.ComplexType中删除),用于测试错误是否消失,但我注意到添加或删除[ComplexTypes]没有区别

这是一个示例网址:

以下是url / v1 / Supplier的结果?apiKey = ca2d711d-31f0-4f14-9eb4-363921db894e&amp; format = json&amp; $ top = 1:http://pastebin.com/CLzAeEFk(注意它有地址)

以下是url / v1 / Supplier的结果?apiKey = ca2d711d-31f0-4f14-9eb4-363921db894e&amp; format = json&amp; $ top = 1&amp; $ expand = TaxCode:http://pastebin.com/ysn6uMHA(注意没有地址)

这是我收到的网址错误:http://localhost:64829/v1/Supplier?apiKey=ca2d711d-31f0-4f14-9eb4-363921db894e&format=json& $ top = 1&amp; $ expand = TaxCode,Address

{  
"Message":"An error has occurred.",
"ExceptionMessage":"Het doel van een aanroep heeft een uitzondering veroorzaakt.",
"ExceptionType":"System.Reflection.TargetInvocationException",
"StackTrace":"   bij System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)\r\n   bij System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)\r\n   bij System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)\r\n   bij System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)\r\n   bij System.Web.OData.Query.ODataQueryOptions.LimitResults(IQueryable queryable, Int32 limit, Boolean& resultsLimited)\r\n   bij System.Web.OData.Query.ODataQueryOptions.ApplyTo(IQueryable query, ODataQuerySettings querySettings)\r\n   bij System.Web.OData.EnableQueryAttribute.ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)\r\n   bij System.Web.OData.EnableQueryAttribute.ExecuteQuery(Object response, HttpRequestMessage request, HttpActionDescriptor actionDescriptor)\r\n   bij System.Web.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- Einde van stacktracering vanaf vorige locatie waar uitzondering is opgetreden ---\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bij System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bij System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
"InnerException":{  
  "Message":"An error has occurred.",
  "ExceptionMessage":"Cannot compare elements of type 'Omnisoft.Domain.ComplexTypes.Adres'. Only primitive types, enumeration types and entity types are supported.",
  "ExceptionType":"System.NotSupportedException",
  "StackTrace":"   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.VerifyTypeSupportedForComparison(Type clrType, TypeUsage edmType, Stack`1 memberPath)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.CreateIsNullExpression(DbExpression operand, Type operandClrType)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.EqualsTranslator.CreateIsNullExpression(ExpressionConverter parent, Expression input)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MemberInitTranslator.TypedTranslate(ExpressionConverter parent, MemberInitExpression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MemberInitTranslator.TypedTranslate(ExpressionConverter parent, MemberInitExpression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateSet(Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)\r\n   bij System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert()\r\n   bij System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)\r\n   bij System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__6()\r\n   bij System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)\r\n   bij System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5()\r\n   bij System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)\r\n   bij System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)\r\n   bij System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()\r\n   bij System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()\r\n   bij System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)\r\n   bij System.Web.OData.Query.TruncatedCollection`1..ctor(IQueryable`1 source, Int32 pageSize)\r\n   bij System.Web.OData.Query.ODataQueryOptions.LimitResults[T](IQueryable`1 queryable, Int32 limit, Boolean& resultsLimited)"
 }
 }

我从扩展功能中删除地址时没有收到错误,但它也没有在实体上显示...

你可以帮我解决这个问题吗?所以我可以在我的数据结构中进行展开+显示复杂类型吗?

我正在使用EF 6.1.3,Asp.Net.MVC 5.2.3,Microsoft.AspNet.WebApi 5.2.3,ODataLib 6.15.0和Microsoft.AspNet.OData 5.9.0

1 个答案:

答案 0 :(得分:0)

  1. 复杂类型将自动选中,不应该是$ expand的一部分,仅适用于导航属性。

  2. 我假设您的供应商有一个地址类型的财产,然后当您收到供应商时,地址将被自动检索。

  3. 你可以参考这个样本, http://services.odata.org/V4/(S(4xq3yia0dzts5gfflfp2sbt5))/TripPinServiceRW/People

    我们可以看到AddressInfo是一个复杂类型Location的集合,它是自动选择的。

    如果您仍有问题,可以显示供应商和地址的元数据吗?