Я разрабатываю приложение с NHibernate 3.0. Я разработал шляпу репозитория, принимающую выражение, чтобы сделать некоторый фильтр с помощью QueryOver. Мой метод примерно такой:
public IEnumerable<T> FindAll(Expression<Func<T, bool>> filter) {
return Session.QueryOver<T>().Where(filter).List();
}
Это работает нормально. Итак, у меня также есть уровень службы, и мои методы в этих службах принимают типы примитивов, например:
public IEnumerable<Product> GetProducts(string name, int? stock, int? reserved) {
// how init the expression ?
Expression<Func<Product, bool>> expression = ???;
if (!string.IsNullOrEmpty(name)) {
//add AND condition for name field in expression
}
if (stock.HasValue) {
//add AND condition for stock field in expression
}
if (reserved.HasValue) {
//add AND condition for reserved field in expression
}
return _repository.FindAll(expression);
}
Мои сомнения:
Является ли это возможным ? При необходимости добавить некоторые условия (когда мои параметры имеют значение)?
Спасибо
/// мои правки
public ActionResult Index(ProductFilter filter) {
if (!string.IsNullOrEmpty(filter.Name) {
return View(_service.GetProductsByName(filter.Name))
}
// others conditions
}
/// Почти решение
Expression<Func<Product, bool>> filter = x => true;
if (!string.IsNullOrEmpty(name))
filter = x => filter.Compile().Invoke(x) && x.Name == name;
if (stock.HasValue)
filter = x => filter.Compile().Invoke(x) && x.Stock == stock.Value;
if (reserved.HasValue)
filter = x => filter.Compile().Invoke(x) && x.Reserved == reserved.Value;
return _repository.FindAll(filter);
x=>(!string.IsNullOrEmpty(name)||name==x.Name)&&(stock.HasValue||x.Stock==stock??0) ... etc
Что я мог бы добавить для вас, так это способ заменить закрытие константами, а затем сократить логическую оценку, чтобы выражение получилось настолько коротким, насколько вы хотите. - person Neil   schedule 20.01.2011