WCF数据服务$ select返回'未实现'异常 [英] WCF Data service $select returning 'Not Implemented' exception

查看:295
本文介绍了WCF数据服务$ select返回'未实现'异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个我正在开发的项目,它有一个Order实体,它具有OrderITems的导航属性:

I have a project I am working on that has a Order entity that has a navigation property for 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:

If I query the OrderItems like so:

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

它工作得很好,但我最终需要绑定到Order。所以,我想这样投资:

It works well but I ultimately need to bind to the Order only. So, I would like to project like this:

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

异常。

项目使用EntityFramework代码第一个4.1数据提供程序,所有的接线出现正确。我添加的唯一的东西是路由以产生干净的restful uris和支持$格式选项通过IDispatchMessageInspector。

Th project is using an EntityFramework code first 4.1 data provider and all of the wiring "appears" correct. The only thing extra I added was routing to produce the clean restful uris and support for the $format option via a IDispatchMessageInspector.

好,由于Vitek的输入,我能够获得更完整的例外:

Ok, Thanks to Vitek's input I was able to get a more complete exception:

<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>


推荐答案

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

If this is using EF Code First it needs to define the service as DataService and override the CreateDataSource to use the trick described in this article in section #5: http://social.technet.microsoft.com/wiki/contents/articles/5234.aspx

否则WCF DS会将DbContext作为反射提供者将运行针对LINQ to对象的查询。这主要是工作,但对于更复杂的查询,它有时会打破。如果WCF DS知道它再次运行EF,它将创建查询EF,它将始终工作。

Otherwise WCF DS treats the DbContext as a reflection provider would and runs queries intended for LINQ to Objects. This mostly works, but for more complicated queries it sometimes breaks. If the WCF DS knows it runs agains EF, it creates queries for EF which will work always.

这篇关于WCF数据服务$ select返回'未实现'异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆