Entity Framework 4.1 - Выбрать - PullRequest
       6

Entity Framework 4.1 - Выбрать

2 голосов
/ 14 апреля 2011

Я использую следующие выражения:

ProductRepository.Query.Include(Function(x) x.ChildProducts.Select(Function(y) y.PriceTiers.Where(Function(z) z.IsActive))).Where(Function(x) x.Categories.Any(Function(y) y.ID = ID))

И получаю эту ошибку:

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.

Если я уберу это:

.Where(Function(z) z.IsActive)

Работает нормально, но мне нужно отфильтровать неактивные ценовые уровни.

Есть идеи?

Обновление

Вот мое решение:

Public Function GetProductsByCategoryID(ID As Integer) As System.Collections.Generic.IEnumerable(Of Core.Entities.Product) Implements Core.Interfaces.IProductService.GetProductsByCategoryID
        Dim Col = ProductRepository.Query.Where(Function(x) x.Display AndAlso x.Categories.Any(Function(y) y.ID = ID)) _
                  .Select(Function(x) New With { _
                              .Product = x,
                              .ChildProducts = x.ChildProducts.Where(Function(y) y.Display).Select(Function(y) New With { _
                                                                                                       .ChildProduct = y,
                                                                                                       .PriceTiers = y.PriceTiers.Where(Function(z) z.IsActive)
                                                                                                   })
                          }).ToList.Select(Function(x) x.Product)

        Return Col

    End Function

1 Ответ

3 голосов
/ 14 апреля 2011

Вы не можете сделать это в одном запросе без проекции или отдельного запроса для загрузки свойства навигации.Лямбда-выражение для Include принимает только точечные обозначения для ссылок и Select для коллекций, но вы не можете выполнять какую-либо фильтрацию.

Фильтрация возможна в отдельном запросе при использовании DbContext API:

var data = context.Entry(product)
                  .Collection(p => p.ChildProducts)
                  .Query()
                  // Here are your filters
                  .Load();

Редактировать:

Для проецирования требуется что-то вроде:

var data = context.Products
                  .Where(...)
                  .Select(p => new 
                      {
                          Product = p,
                          ChildProducts = p.ChildProducts.Where(...)
                      });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...