5

我有这样的课:

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

3 回答 3

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
于 2013-03-29T18:56:58.207 回答
3

您可以为此使用动态 linq 库

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

或者您可以自己构建表达式:

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);
}
于 2013-03-29T18:57:14.577 回答
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));
}

就我个人而言,我更喜欢使用 fluent api,因为它不那么冗长,并且使将 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));
}
于 2013-03-29T19:02:24.917 回答