2013-03-29 15 views
5

ich eine Klasse wie dieses:Linq Suche nach differents Werte

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

Und ich muss eine Suche von dem Benutzer empfangen durch den Wert machen, könnte es sein, ein Attribut dieser Klasse. Ich habe das auch:

Ich habe vier Methoden wie folgt, der einzige Unterschied ist das Attribut. Kann mir bitte jemand sagen, wie kann ich das mit nur einer Methode machen oder ist das nicht möglich? Vielen Dank.

Antwort

5

Keine Notwendigkeit, separate Methoden zu schreiben. Eine einzige Methode wäre genug:

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

es dann so nennen:

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

Sie auch die Zeichenfolge der dort wechseln könnte T, und mache es generisch und arbeite für alles –

+0

Dies funktioniert nicht für linq-to-sql. Ändern Sie die Signatur, um 'Express >' und den Textkörper zu akzeptieren, um '.Where' zu ​​erstellen. –

+0

@HosseinNarimaniRad wird leider immer noch nicht in Linq-to-Sql/Entities funktionieren. –

3

Sie die dynamic linq library für dieses

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

verwenden können Oder Sie könnten die Ausdrücke selbst bauen:

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 Gut. Das wusste ich nicht. –

1

Der einfachste Weg wäre, die WHERE-Anweisung in eine ODER-Operation umzuwandeln.

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)); 
} 

persönlich bevorzuge ich die fließend api verwenden, da es weniger ausführlich ist und macht Verkettungs LINQ-Befehle zusammen ein wenig mehr auf der Hand ... hier ist, dass die Umsetzung auch

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)); 
}