Эффективный фильтр запросов Entity Framework - PullRequest
1 голос
/ 13 февраля 2012

На моем сайте MVC я использую EF 4.1 для доступа к данным. Сейчас я разрабатываю функциональность поиска товаров. Подпись метода для получения отфильтрованных продуктов:

PagedList<Dress> GetDressesPage<TKey>(int page, int dressesPerPage, Func<Dress, bool> selection, Func<Dress, TKey> order, SortDirection direction);

и способ получения продуктов:

dresses = _context.Dresses.Where(selection).OrderBy(order).Skip(page * dressesPerPage).Take(dressesPerPage).ToList();

Проблема с функцией выбор . Я хотел бы быть в состоянии построить это, добавляя различные условия. Сейчас я строю это, используя некоторые условия if для каждой комбинации параметров ... но это становится слишком сложным.

Знаете ли вы более простой способ, которым я мог бы передать фильтр в качестве параметра?

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

Используйте Predicate Builder . Заменить Func<Dress, bool> на Expression<Func<Dress, bool>>. В противном случае запросы превратятся в LINQ-to-Objects.

  var predicate = PredicateBuilder.True<Dress>();
  if (!string.IsNullOrEmpty(name))
  {
       predicate = predicate.And(d => d.Name.Contains(name));
  }

  dresses = _context.Dresses.Where(predicate).OrderBy(order)
      .Skip(page * dressesPerPage).Take(dressesPerPage).ToList();
0 голосов
/ 13 февраля 2012

идеальной библиотекой для этого является "LinqKit".

Пример использования:

    public static IEnumerable<DressItem> QueryDresses(FashionEntities ctx, Expression<Func<dresses, bool>> predicate)
    {
        var query = (from dress in ctx.dresses
                         .AsExpandable()
                         .Where(predicate)                    
                  select new DressItem { 
                      id = dress.Id, 
                      name = dress.Name, 
                      price = dress.Price 
                  };
        return query;
    }

Как видите, метод принимает предикат, который можно создать в вызывающем методе какследует:

  Expression<Func<dresses, bool>> predicate = d => d.Price > 1000;

  if (lalalala == llalala) {
      predicate = d => d.Price > 2000;
  }

  var result = new List<DressItem>();
  using (var ctx = new FashionEntities())
  {
       var dresses = QueryDresses(ctx, predicate.Expand());
       result = dresses.ToList();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...