我有一个看起来像(它是荷兰语)的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
答案 0 :(得分:0)
复杂类型将自动选中,不应该是$ expand的一部分,仅适用于导航属性。
我假设您的供应商有一个地址类型的财产,然后当您收到供应商时,地址将被自动检索。
你可以参考这个样本, http://services.odata.org/V4/(S(4xq3yia0dzts5gfflfp2sbt5))/TripPinServiceRW/People
我们可以看到AddressInfo是一个复杂类型Location的集合,它是自动选择的。
如果您仍有问题,可以显示供应商和地址的元数据吗?