Установить EntityCollection в проекции Linq - PullRequest
3 голосов
/ 28 декабря 2010

Я хотел бы знать, как я могу установить EntityCollection в проекции Linq.Ниже мой код:

var orders = (from order in context.Orders
   select new
   {
    reference = order.reference,
    pe = order.OrderExecutions //this is an EntityCollection
   })
.AsEnumerable()
.Select(o =>
     (Orders)new Orders
     {
      reference = o.reference,
      OrderExecutions = o.pe
     }
).ToList().AsQueryable();

(Этот код кажется странным, но он должен быть таким, чтобы работать в сетке telerik)

Инструкция OrderExecutions = o.pe связана с этой ошибкой:

Коллекция EntityCollection уже инициализирована.Метод InitializeRelatedCollection следует вызывать только для инициализации новой коллекции EntityCollection во время десериализации графа объекта.

OrderExecutions - это коллекция EntityCollection, содержащаяся в объекте Orders.

Как можно избежать этой ошибки?Есть идеи?

Стоит ли изменять сгенерированный код в объекте Order?

[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("PModel", "FK__orderExec__refer__70DDC3D8", "OrderExecutions")]
public EntityCollection<OrderExecutions> OrderExecutions
{
 get
 {
  return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<OrderExecutions>("PModel.FK__orderExec__refer__70DDC3D8", "OrderExecutions");
 }
 set
 {
  if ((value != null))
  {
   ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<OrderExecutions>("PModel.FK__orderExec__refer__70DDC3D8", "OrderExecutions", value);
  }
 }
}

Заранее спасибо.

1 Ответ

0 голосов
/ 26 мая 2011

Запрос должен быть переписан как

var orders = from order in context.Orders
             select new
             {
                 reference = order.reference,
                 OrderExecutions = order.OrderExecutions //this is an EntityCollection
              };

Нет необходимости преобразовывать в IEnumerable, а затем повторно выбирать те же поля. И тогда нет необходимости преобразовывать в список, а затем обратно в IQueryable, потому что запрос LINQ естественным образом возвращает объект IQueryable. При вызове ToList () выполняется запрос к источнику данных . Почти всегда лучше отложить эти вызовы до тех пор, пока не будут введены какие-либо дополнительные ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...