用单个Search()函数搜索数据库,动态在哪里

时间:2014-12-23 20:10:33

标签: c# database linq

我在数据库中有一个庞大的人员数据集。我想根据给定的搜索参数返回一个人员列表。

我的梦想界面(最好我的知识)将是。

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

3 个答案:

答案 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)。