2012-02-10 51 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