2016-11-30 33 views
0

我正在寫有一個搜索欄,允許用戶搜索人員通過他們的名字申請 - 名字,中間名和姓EF6:有效的方法來搜索名稱在一個IQueryable

搜索輸入可以是名字或中間名或姓。或者First和name的組合;中間名等等。

或全名。

現在我這樣做:

var result = People.Where(e => e.FirstName.ToLower().Contains(model.Name.ToLower()) || e.LastName.ToLower().Contains(model.Name.ToLower()) || e.MiddleName.ToLower().Contains(model.Name.ToLower())); 

我不知道這是最有效的方式還是可以改進?

+0

該搜索輸入只能成爲中間名,那麼你爲什麼要將它與Firstname和你的where子句中的姓氏進行比較? – Nirman

+0

不只是中間名,它可以是首字母,中間名和姓氏的組合或全名。我更新了這個問題。 – capiono

+0

看看http://www.albahari.com/nutshell/predicatebuilder.aspx –

回答

4

由於馬爾科阿爾維斯說,你可以使用LINQKit庫是這樣的:

var predicate = PredicateBuilder.New<People>(); 
if(!String.IsNullOrEmpty(model.FirstName)) 
    predicate = predicate.Or(p => p.FirstName.Contains(model.FirstName)); 
if(!String.IsNullOrEmpty(model.LastName)) 
    predicate = predicate.Or(p => p.LastName.Contains(model.LastName)); 
if(!String.IsNullOrEmpty(model.MiddleName)) 
    predicate = predicate.Or(p => p.MiddleName.Contains(model.MiddleName)); 

var result = context.People.AsExpandable().Where(predicate).ToList(); 
0

您可能正在尋找類似於Predicate Builder的東西,它允許您更輕鬆地控制where語句的AND和OR。

還有Dynamic Linq它允許您像提交一個SQL字符串一樣提交WHERE子句,它會將它解析爲WHERE的正確謂詞。

0

,當你說你可以考慮連接所有您的姓名和檢查IndexOf(input) > -1

var result = People.Where(e => 
     (e.FirstName + " " + e.MiddleName + " " + e.LastName).IndexOf(model.Name) > -1); 
相關問題