Linq搜索不同的值

本文关键字:搜索 Linq | 更新日期: 2023-09-27 18:06:36

我有一个这样的类:

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

我有四个这样的方法,唯一的区别是属性。请问,谁能告诉我如何只用一种方法做到这一点?谢谢。

Linq搜索不同的值

无需编写单独的方法。一个方法就足够了:

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

您可以使用动态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);
}

最简单的方法是将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));
}