我在数据库中有一个庞大的人员数据集。我想根据给定的搜索参数返回一个人员列表。
我的梦想界面(最好我的知识)将是。
List<People> myList1 = PersonSearch(p => (p.Name = "Tester"));
List<People> myList2 = PersonSearch(p => (p.ID = 123));
在我的情况下,性能是一个大问题所以我不想加载一个巨大的集合然后过滤。我希望我的数据库只根据我的搜索条件返回重要的结果。
我已经有一个Person类(不直接绑定到我的数据库表)和单独的Find()函数。
Person person = FindByID(int id);
List<People> people = FindByName(string name);
无论如何都可以轻松完成单个Search(),还是必须保留我的多个Find()函数?
昨天我问了一个类似的问题,但结果让我自己感到困惑:
https://stackoverflow.com/questions/27608861/lazy-collection-find-with-predicate
答案 0 :(得分:4)
您可以像这样创建PersonSearch
函数:
public List<People> PersonSearch(Expression<Func<T,bool>> predicate)
{
return db.Persons.Where(predicate).ToList();
}
您甚至可以为所有实体工作:
public List<T> Search<T>(Expression<Func<T,bool>> predicate) where T: class
{
return db.Set<T>().Where(predicate).ToList();
}
答案 1 :(得分:0)
您应该使用Expression
类型的参数:
public List<People> PersonSearch(Expression<Func<Person, bool>> predicate)
{
return db.Set<Person>().Where(predicate).ToList();
}
这很重要,因为有两个Where
扩展 - 一个用于内存中IEnumerable,另一个用于IQueryable。您应该使用IQueryable扩展,它接受Expression<Func<T,bool>>
将过滤器转换为SQL并在服务器端执行它。
答案 2 :(得分:0)
这里缺少的信息是根本没有使用任何ORM(对象关系映射)。使用经典ADO.NET对象连接到数据库将无法提供所需的功能,必须使用ORM(如Entity Framework)。