【问题标题】:WCF Data service how to query navigation property that a collectionWCF数据服务如何查询一个集合的导航属性
【发布时间】:2012-01-19 20:51:35
【问题描述】:

我正在处理一个项目,该项目有一个 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\Orders?$filter=OrderItems\ProductId eq 1234

但是,我似乎无法让它发挥作用。有任何想法吗?我很乐意提供更多详细信息。

项目首先使用 EntityFramework 代码 4.1 数据提供者。

更新了异常和调用堆栈:

未实现 无法创建类型为“System.Data.Services.Internal.ProjectedWrapper1”的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。 System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq) 处的 System.NotSupportedException

   在 System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter 父级,表达式 linq)

   在 System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式 linq)

   在 System.Data.Objects.ELinq.ExpressionConverter.ConditionalTranslator.TypedTranslate(ExpressionConverter 父级,ConditionalExpression linq)

   在 System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter 父级,表达式 linq)

   在 System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式 linq)

   在 System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression 输入)

   在 System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression 输入,DbExpressionBinding& 绑定)

   在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter 父级,MethodCallExpression 调用,DbExpression& 源,DbExpressionBinding& sourceBinding,DbExpression& lambda)

   在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter 父,MethodCallExpression 调用)

   在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter 父,MethodCallExpression 调用,SequenceMethod 序列方法)

   在 System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter 父,MethodCallExpression linq)

   在 System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter 父级,表达式 linq)

   在 System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式 linq)

   在 System.Data.Objects.ELinq.ExpressionConverter.Convert()

   在 System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan (Nullable`1 forMergeOption)

   在 System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)

   在 System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()

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

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

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

   在 System.Data.Services.WebUtil.GetRequestEnumerator(IEnumerable 可枚举)
    

【问题讨论】:

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


    【解决方案1】:

    使用当前发布的位,您将不得不改变查询:

    /OrderItems?$expand=Order&$filter=ProductId eq 1234

    这种方法的缺点是,如果一个订单有两个带有过滤产品 ID 的 OrderItem,您将获得两次相同的订单。此外,您将获得所有过滤的 OrderItems。您可以使用 $select 来缩小下载的数据量。

    在最新的 CTP (http://blogs.msdn.com/b/astoriateam/archive/2011/10/13/announcing-wcf-data-services-oct-2011-ctp-for-net-4-and-silverlight-4.aspx) 中,支持任何/全部,这就是您将在此处使用的。有关详细信息,请参阅此博文http://www.odata.org/blog/even-more-any-and-all

    【讨论】:

    • 谢谢 Vitek。这是我希望避免的。由于这是一个将在不到一个月的时间内投入生产的项目,我不相信我可以使用新的 CTP,但这看起来对未来很有好处。另一个注意事项。不幸的是,我的 $select 失败并出现“未实现”错误。
    • Re“未实现”:这可能意味着您在服务器上使用了某种自定义提供程序。因此,您需要联系编写该服务器提供商的人。
    • 实际上,我创建了提供程序,它是一个非常标准的 EF Code First 4.1 提供程序。
    • 然而,我正在使用一些自定义 URL 重写来实现干净、宁静的 uri。会不会是这个问题?
    • 在这种情况下,您可以发布完整的异常,包括调用堆栈吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多