2013-03-29 21 views
5

値:LINQの検索が、私はこのようなクラス持っ

class Person 
{ 
    private String sName; 
    private String sPhone; 
    private String sAge; 
    private String sE_Mail; 
    // … code … 
} 

をそして、私は、ユーザーから受信した値で検索を行う必要があり、それは、このクラスの任意の属性である可能性があります。私もこれを持っています:

public IEnumerable<Person> SearchByPhone(string value) 
{ 
    return from person in personCollection     
      where person.**SPhone** == value 
      select person; 
} 

私はこのような4つの方法がありますが、唯一の違いは属性です。どうか私はこれをただ一つの方法でやってもいいのですか?ありがとう。

答えて

5

別個の方法を書く必要はありません。単一の方法は十分だろう。

public IEnumerable<Person> Search<T>(T value, Func<Person,T> mapFunc) 
{ 
    return from person in personCollection     
      where mapFunc(person).Equals(value) 
      select person; 
} 

次に、このようにそれを呼び出す:

Search("SOME VALUE", input=>input.sPhone); //sPhone must be public 
Search("SOME VALUE", input=>input.sAge);  //sAge must be public 
+2

あなたもに文字列の存在に切り替えることができます...流暢なAPIを使用して好みますTを作成し、それを一般化して何かのために働かせてください –

+0

これはlinq-to-sqlでは機能しません。 'Express >'を受け入れるように署名を変更し、本文に '.Where'を実行します。 –

+0

@HosseinNarimaniRad残念ながら、それはLinq-to-Sql/Entitiesではまだ動作しません。 –

3

あなたはこの

public IQueryable<Person> Search(string column, string value) 
{ 
    return personCollection.Where(string.Format("{0} = @1", column), value); 
} 

それとも、表現を自分で構築できるためdynamic linq libraryを使用することができます。

public IQueryable<Person> Search(string column, string value) 
{ 
    var param = Expression.Parameter(typeof(T), "x"); 
    var prop = Expression.Property(param, column); 
    var val = Expression.Constant(value, prop.Type); 
    var equals = Expression.Equal(prop, val); 
    var lambda = Expression.Lambda(equals, param); 
    return personCollection.Where(lambda); 
} 
+0

+1。私はそれを知らなかった。 –

1

最も簡単な方法は、whereステートメントをorにすることです。個人的に

public IEnumerable<Person> SearchByValue(string value) 
{ 
    return from person in personCollection 
      where (person.sName.Equals(value) || 
       person.sPhone.Equals(value) || person.sAge.Equals(value) || 
       person.sE_Mail.Equals(value)); 
} 

それはそれほど冗長だとLINQは、一緒にもう少し明らかコマンド連鎖を作るように私はここでその実装が同様

public IEnumerable<Person> SearchByValue(string value) 
{ 
    return personCollection.Where(p => p.sName.Equals(value) || 
       p.sPhone.Equals(value) || p.sAge.Equals(value) || 
       p.sE_Mail.Equals(value)); 
}