Linq to Entities - «где», чтобы вернуть список продуктов и связанных элементов, включающих проверку - PullRequest
2 голосов
/ 17 ноября 2011

Может кто-нибудь помочь мне со следующим? Я использую Linq для сущностей (сначала код).

У меня есть объект Products, который сопоставлен (от 1 до многих) в моем контексте БД с моим объектом ProductAreas.

Этот запрос работает и возвращает мне список включенных продуктов, включая связанные с ними области:

IQueryable<Product> products = from Product in db.Product.Include(p=>p.ProductAreas)
                           where (Product.BrandId == brandid && Product.Enabled == true)
                           select Product;

Я хочу добавить фильтр, чтобы я также только возвращал ProductAreas, которые включены.

Это то, что я изначально пробовал:

  IQueryable<Product> products = from Product in db.Product.Include(p=>p.ProductAreas.Where(pa=>pa.Enabled == true))
      where (Product.BrandId == brandid && Product.Enabled == true)

но когда я запускаю свой код, я получаю следующую ошибку: "Выражение« Включить путь »должно относиться к свойству навигации, определенному для типа. Используйте пунктирные пути для ссылочных свойств навигации и оператор« Выбор »для свойств навигации коллекции. Имя параметра: путь "

Полагаю, я хочу добавить фильтр в мой каталог где-нибудь? Я пробовал это, но это только возвращает мне продукты, которые имеют области (и все еще возвращают ProductAreas, которые не включены)

IQueryable<Product> products = from Product in db.Product.Include(p=>p.ProductAreas)
                           where (Product.BrandId == brandid && Product.Enabled == true && Product.ProductAreas.FirstOrDefault(a=>a.Enabled == true) != null)
                           select Product;

Любая помощь очень сильно оценена (как вы, вероятно, можете сказать, я только изучаю Linq to Entities !!)

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

Фильтрация по включаемому отношению - это то, что вы можете сделать следующим образом:

var products = (from p in db.Product
               where (p.BrandId == brandid && p.Enabled)
select new
{
  Product = p,
  ProductAreas = p.ProductAreas.Where(pa=>pa.Enabled)
}).Select(p => p.Product);

Из-за автоматического исправления отношений в EF это работает. Это известный «побочный эффект».

0 голосов
/ 17 ноября 2011

Вы должны иметь возможность использовать проекцию в этом случае:

var results = from product in db.Product
              where (product.BrandId == brandid && product.Enabled)
              select new 
              { 
                  Product = product, 
                  ProductAreas = product.ProductAreas.Where(pa=>pa.Enabled)
              };
IQueryable<Product> products = results.Select( x => x.Product);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...