【问题标题】:WCF Data service $select returning 'Not Implemented' exceptionWCF 数据服务 $select 返回“未实现”异常
【发布时间】:2012-01-20 19:33:43
【问题描述】:

我正在处理一个项目,该项目有一个 Order 实体,该实体具有 OrderITems 的导航属性:

public class Order
{
   public int OrderId { get; set; }
   public int CustomerId { get; set; }

   public virtual ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
   public int OrderId { get; set; }
   public int ProductId { get; set; }
   public int Quantity { get; set; }

   public virtual Order Order { get; set; }
}

如果我像这样查询 OrderItems:

http://mysvc.com/mysvc/OrderItems?$expand=Order&$filter=ProductId eq 1234

它运作良好,但我最终只需要绑定到订单。所以,我想这样投影:

http://mysvc.com/mysvc/OrderItems?$expand=Order&$filter=ProductId eq 1234&$select=Order

但是,我收到“未实施”异常。

项目首先使用 EntityFramework 代码 4.1 数据提供程序,并且所有接线“显示”正确。我唯一添加的额外内容是通过 IDispatchMessageInspector 路由生成干净的 restful uri 和对 $format 选项的支持。

好的,感谢 Vitek 的输入,我能够获得更完整的异常:

<error>
    <code/>
    <message xml:lang="en-US">Not Implemented</message>
    <innererror>
        <message>Unable to create a constant value of type 'System.Data.Services.Internal.ProjectedWrapper1'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.
        </message>
        <type>System.NotSupportedException</type>
        <stacktrace>   at System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq)

           at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)

           at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)

           at System.Data.Objects.ELinq.ExpressionConverter.ConditionalTranslator.TypedTranslate(ExpressionConverter parent, ConditionalExpression linq)

           at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)

           at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)

           at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)

           at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)

           at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)

           at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)

           at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)

           at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)

           at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)

           at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression 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<T>.GetEnumerator()

           at System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator()

           at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.IEnumerable.GetEnumerator()

           at System.Data.Services.Internal.ProjectedWrapper.EnumerableWrapper.System.Collections.IEnumerable.GetEnumerator()

           at System.Data.Services.WebUtil.GetRequestEnumerator(IEnumerable enumerable)
           </stacktrace>
    </innererror>
</error>

【问题讨论】:

  • 请发布实际异常及其调用堆栈。

标签: c#-4.0 entity-framework-4.1 wcf-data-services


【解决方案1】:

如果这是使用 EF Code First,它需要将服务定义为 DataService 并覆盖 CreateDataSource 以使用本文第 5 节中描述的技巧:http://social.technet.microsoft.com/wiki/contents/articles/5234.aspx

否则,WCF DS 将 DbContext 视为反射提供程序,并运行旨在用于 LINQ to Objects 的查询。这主要是有效的,但对于更复杂的查询,它有时会中断。如果 WCF DS 知道它再次运行 EF,它会为 EF 创建查询,这将始终有效。

【讨论】:

  • 就是这样。我按照说明进行操作,现在它就像一个魅力。非常感谢 Vitek!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 2014-11-09
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多