Linq按不同值搜索

时间:2013-03-29 18:53:50

标签: c# 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;
}

我有四种这样的方法,唯一的区别是属性。请问,任何人都可以告诉我如何只用一种方法做到这一点或者不可能做到这一点?感谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

您可以将dynamic linq library用于此

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

答案 2 :(得分:1)

最简单的方法是将where语句转换为或操作。

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));
}
个人而言,我更喜欢使用流畅的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));
}