EF中的HashSet过滤

时间:2014-01-31 09:25:58

标签: c# asp.net entity-framework

我有一种搜索数据库中人员的方法。我想重构它,以便它使用hashsets来提高性能。

我在下面做了一个简化的例子(不会编译,只是为了给你一个想法)。

我的示例中是否可以使用HashSet

using (var context = new MyEntities())
{
    var persons = new HashSet<PERSON>(context.PERSON);

    if(!string.IsNullOrEmpty(age))
    {
        persons = persons.Where(p => p.age == age);
    }

    if(!string.IsNullOrEmpty(name))
    {
        persons = persons.Where(p => p.name.StartsWith(name));
    }
    //some similar filtering...

    return persons.ToList();
}

1 个答案:

答案 0 :(得分:1)

正如评论中所述,以下代码行不是一个好主意

var persons = new HashSet<PERSON>(context.PERSON);

因为它会从PERSON DbSet中提取所有数据并将其插入person对象。

您的代码几乎尽可能优化,而无需将所有数据读入HashSet

我建议您构建一个IQueryable对象,该对象将触发相关的定制Sql来过滤您的数据。在您调用ToList()

之前,不会从数据库中读取任何内容
var persons = context.PERSON.AsQueryable();

if(!string.IsNullOrEmpty(age))
{
    persons = persons.Where(p => p.age == age);
}

if(!string.IsNullOrEmpty(name))
{
    persons = persons.Where(p => p.name.StartsWith(name));
}
//some similar filtering...

return persons.ToList();