使用单个 Search() 函数搜索数据库,动态位置

本文关键字:数据库 搜索 动态 位置 函数 单个 Search | 更新日期: 2023-09-27 18:35:19

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

梦想的界面(据我所知)是。

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

使用单个 Search() 函数搜索数据库,动态位置

您可以像这样创建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();
}

您应该使用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 并在服务器端执行。

这里缺少的信息是根本没有使用任何ORM(对象关系映射)。 使用经典 ADO.NET 对象连接到数据库将不提供所需的功能,必须使用 ORM,例如实体框架。