Кодекс Entity Framework First и критерии поиска - PullRequest
9 голосов
/ 19 октября 2010

Итак, у меня есть модель, созданная в Entity Framework 4 с использованием первых функций кода CTP4.Это все хорошо работает вместе.

Я пытаюсь добавить функцию расширенного поиска в свое приложение.Эта функция «расширенного поиска» позволяет пользователям вводить несколько критериев для поиска.Например:

Расширенный поиск продукта

  • Имя
  • Дата начала
  • Дата окончания

Это позволит пользователю выполнять поиск по названию продукта, а также ограничивать результаты датами их создания.

Проблема в том, что я не знаю, сколько из этих полей будет использоваться влюбой отдельный поиск.Как тогда можно построить мой запрос Entity Framework?

У меня есть пример , описывающий, как создать динамический запрос для Entity Framework, однако, похоже, это не работает для классов POCO, которые я создал для персистентности Code First.* Как лучше всего построить запрос, когда число ограничений неизвестно?

Ответы [ 2 ]

20 голосов
/ 20 октября 2010

Итак, после нескольких часов работы над этой проблемой (и некоторой помощи от нашего друга Google) я нашел работоспособное решение моей проблемы. Я создал следующее расширение выражения Linq:

using System;
using System.Linq;
using System.Linq.Expressions;

namespace MyCompany.MyApplication
{
    public static class LinqExtensions
    {
        public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate)
        {
            if (condition)
                return source.Where(predicate);
            else
                return source;
        }
    }
}

Это расширение позволяет создавать запрос Linq следующим образом:

var products = context.Products.WhereIf(!String.IsNullOrEmpty(name), p => p.Name == name)
                               .WhereIf(startDate != null, p => p.CreatedDate >= startDate)
                               .WhereIf(endDate != null, p => p.CreatedDate <= endDate);

Это позволяет каждому оператору WhereIf влиять на результаты только в том случае, если он соответствует предоставленному условию. Решение, кажется, работает, но я всегда открыт для новых идей и / или конструктивной критики.

0 голосов
/ 10 февраля 2014

Джон,

Ваше решение просто потрясающее! Но, просто чтобы поделиться, я использовал этот метод выше, пока не увижу ваши идеи.

var items = context.Items.Where(t => t.Title.Contains(keyword) && !String.IsNullOrEmpty(keyword));

Так что, кажется, это не лучшее решение для этого, но наверняка это обходной путь.

...