Служба данных WCF, как запросить свойство навигации, что коллекция - PullRequest
1 голос
/ 20 января 2012

У меня есть проект, над которым я работаю, в котором есть сущность 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

ex: http: \ mysvc.com \ mysvc \ Orders? $ Filter = OrderItems \ ProductId eq 1234

Однако я не могу заставить это работать.Есть идеи?Я был бы рад предоставить более подробную информацию.

Проект использует код данных EntityFramework, сначала провайдер данных 4.1.

Обновлено с исключением и стэком вызовов:

Not Implemented 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.System.NotSupportedException   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.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)
    

1 Ответ

1 голос
/ 20 января 2012

С текущими выпущенными битами вам придется перевернуть запрос:

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

Недостатком этого подхода является то, что еслиодин заказ имеет два OrderItems с отфильтрованным идентификатором продукта, вы получите один и тот же заказ дважды.Также вы получите все отфильтрованные элементы 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) есть поддержка any / all, что вы и использовали бы здесь. Смотрите этот блогсообщение для деталей http://www.odata.org/blog/even-more-any-and-all.

...