Поиск действий с использованием предиката linq.ASP.NET MVC - PullRequest
0 голосов
/ 10 февраля 2012

Мне интересно, как реализовать функцию поиска?

Давайте посмотрим, как я могу представить об этом.Я буду использовать 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 ... );
}

Представление Search будет содержать форму с текстовыми полями , соответствующими критериям поиска / параметрам действия.

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

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

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

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

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

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

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

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

В качестве альтернативы, вы можете рассмотреть шаблон спецификации . Это отделяет задачу выбора объектов от задачи выбора объектов. Вот пример с NHibernate здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...