2012-02-10 2 views
0

Мне интересно, как реализовать функцию поиска?Поиск действия с использованием предиката linq. ASP.NET MVC

Посмотрим, как я могу себе представить. Я буду использовать модель employee для примера. Таким образом, employee обладает довольно стандартными свойствами: 'Id', EmployeeId, Name, Birthday.

Мой Repository объект содержит метод, как:

IQueryable<T> Get(Expression<Func<T, Boolean>> predicate); 

Итак Search (принадлежит EmployeeController) действие будет выглядеть

[HttpPost] 
public ViewResult Search(Guid Id, Guid EmployeeId, String Name, DateTime birthday) 
{ 
    // call repository.get(x => x.Name == Name && x.Id == Id ...); 
} 

The Search зрения затем держат форму с текстовых соответствующие критериям поиска/параметрам действия.

Но там способность поиска связана с моделью/контроллером. Поэтому мне нужно будет создать подобное действие для каждого контроллера.

Как это сделать лучше?

Спасибо!

ответ

0

Если вы говорите, что предикатный код повторяется во всех вызовах в репозиторий, то вы должны либо сделать эту часть репозитория, создав конкретный EmployeeRepository, который может либо быть получен из вашего общего репозитория, либо использовать его по составу:

public class EmployeeRepository : GenericRepository<Employee> 
{ 
    public IEnumerable<Employee> GetEmployeesBySearch(string id, string name...) 
    { 
    return this.Get(x => x.Name == name && ...); 
    } 
} 

в качестве альтернативы можно рассмотреть specification pattern. Это отделяет внимание от выбора объектов, из которых вы хотите выбрать объекты. Существует пример с NHibernate here.

+0

Nope. Не за что. Вещь не в повторных повторениях (очевидно, что предикаты будут различны). Дело в повторении действий между контроллерами. Мне было интересно, может быть, я мог бы абстрагироваться от функции «Поиск»? – lexeme

+0

Я не совсем уверен, что я следую, вы говорите, что у вас есть аналогичная форма поиска для каждого типа сущности на каждом представлении? или вы говорите, что у вас есть одна форма поиска, которая должна использоваться в нескольких представлениях, например, в заголовке? – devdigital

+0

Пока у меня их нет. Но ваш последний вариант - это то, что я хочу. И я не хочу менять класс репозитория. Но я собираюсь рассмотреть то, что вы посоветовали. – lexeme

1

1 - Вы можете использовать ViewModel, проходя ваши аргументы ваших действий

[HttpPost] 
public ViewResult Search(EmployeeViewModel model) 
{ 
    //logic 
} 

2 - Для общей функции поиска, вы можете использовать Dynamic Linq.

Смежные вопросы