Entify Framework Как сделать, где или с помощью Linq (предикат) - PullRequest
0 голосов
/ 16 февраля 2012

Я пытаюсь сделать ИЛИ. Я думал, что вы могли бы сделать это с Predicate, поэтому я попробовал это

var products = ctx.Products.Where(x => .....);

var predicate = PredicateBuilder.False<Product>();
foreach (Category categ in categs)
  predicate = predicate.Or(p => p.Categories.Select(c => c.Id).Contains(categ.Id)
                              || p.Categories.Select(c => c.Category1.Id).Contains(categ.Id)
                              || p.Categories.Select(c => c.Category1.Category1.Id).Contains(categ.Id));
products = products.Where(predicate);

но это дает мне эту ошибку

System.NotSupportedException: тип узла выражения LINQ 'Invoke' не поддерживается в LINQ to Entities.

Может ли кто-нибудь помочь мне решить эту проблему? Спасибо заранее.

A Product может иметь один или несколько Category.
Category может иметь «родительскую категорию» под названием Category1. Эти длинные 3 строки выше предназначены для выбора товаров в категории или ее дочерних категориях.

Я гуглил и нашел LinqKit, но я хочу не добавлять сторонних разработчиков только для этого. Но если мне нужно использовать LinqKit, легко ли его установить?

1 Ответ

0 голосов
/ 16 февраля 2012

Я думаю, что это работает

if (categs.Length > 0)
{
  List<Product> tmpProducts = new List<Product>();
  foreach (Category c in categs)
  {
    var tmp = ctx.Products.ToList().Where(x => x.IsUnderCategory(c));
    tmpProducts = tmpProducts.Union(tmp).ToList();
  }
  products = products.ToList().Intersect(tmpProducts).AsQueryable();
}

IsUnderCategory является расширением

  public partial class Category
  {
    public bool IsUnderCategory(Category categ)
    {
      if (Id == categ.Id) return true; // is itself

      if (Parent == null)
        return false;

      return Parent.IsUnderCategory(categ);
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...