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;
}
我有四个这样的方法,唯一的区别是属性。请问,谁能告诉我如何只用一种方法做到这一点?谢谢。
无需编写单独的方法。一个方法就足够了:
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));
}