2012-02-10 69 views
0

我想知道如何实现搜索功能?使用linq谓词的搜索动作。 ASP.NET MVC

让我们来看看我如何想象它。我将使用employee模型作为示例。所以employee保持相当标准的属性:'Id',EmployeeId,NameBirthday

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视图,然后将举行形式文本框对应于搜索标准/动作参数。

但是有搜索能力耦合到模型/控制器。所以我需要为每个控制器创建类似的操作。

如何以一些更好的方式?

谢谢!

回答

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

没有。一点也不。事情不在谓词重复中(显然谓词会不一致)。事情是在行动中重复控制器。我想知道也许我可以抽象出'Search'功能吗? – lexeme 2012-02-10 08:38:47

+0

我不太确定我是否遵循,你是否说你在每个视图上的每种类型的实体都有类似的搜索表单?或者你是说你有一个搜索表单需要在多个视图中使用,例如在标题中? – devdigital 2012-02-10 08:47:18

+0

现在我都没有。但你最后的选择是我想要的。我不想更改存储库类。但我会考虑你的建议。 – lexeme 2012-02-10 09:08:57

1

1 - 您可以使用视图模型,同时通过你的论点到你的动作

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

2 - 对于通用搜索功能,您可以使用Dynamic Linq