2016-11-30 10 views
0

で名前を検索するための効率的な方法私は、ユーザーが自分の名前で人を検索することができます検索バーを持つアプリケーション書いている - ファーストネーム、ミドルネーム、および姓EF6:のIQueryable

検索入力は、名またはミドルネームまたは姓のいずれかです。または、最初と名前の組み合わせ。最初と中間の名前など....

またはフルネーム。

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句のlastnameと比較しますか? – Nirman

+0

中間名だけでなく、First、Middle、およびLastNameのいずれか、またはフルネームの組み合わせにすることができます。私は質問を更新しました。 – 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もあります。これにより、WHERE句をSQL文字列のように送信し、それをWHERE句の正しい述語に解析します。

0

あなたはその検索入力ができるだけで言うと、すべてのあなたの名前を連結し、IndexOf(input) > -1

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