C# EF中的HashSet过滤
我有一个在我的数据库中搜索人的方法。我想对它进行重构,以便它使用哈希集来提高性能 我在下面做了一个简化的例子(它不会编译,只是给你一个想法) 在我的示例中是否可以使用C# EF中的HashSet过滤,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一个在我的数据库中搜索人的方法。我想对它进行重构,以便它使用哈希集来提高性能 我在下面做了一个简化的例子(它不会编译,只是给你一个想法) 在我的示例中是否可以使用哈希集 using (var context = new MyEntities()) { var persons = new HashSet<PERSON>(context.PERSON); if(!string.IsNullOrEmpty(age)) { persons = p
哈希集
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();
}
使用(var context=new myenties())
{
var persons=新哈希集(context.PERSON);
如果(!string.IsNullOrEmpty(年龄))
{
人员=人员,其中(p=>p.age==年龄);
}
如果(!string.IsNullOrEmpty(名称))
{
persons=persons.Where(p=>p.name.StartsWith(name));
}
//一些类似的过滤。。。
返回人员。ToList();
}
如评论中所述,下面这行代码不是一个好主意
var persons = new HashSet<PERSON>(context.PERSON);
警告如果person表太大,您将耗尽内存,因为所有的person都将加载到内存中。只需让数据库为您进行过滤。如果查询速度慢,请检查您的查询并使用索引。它可以被使用。你遇到问题了吗?@Rezoan Hashset没有Where()方法,所以是的,我确实遇到了问题。@Johan,我不明白。在HashSet中,我已经多次使用Where()。这是一种扩展方法。如果它没有出现,请尝试使用:yourhashSetObject.asEnumarable()。@Rezoan如果我在这里出错,请纠正我的错误,但只要我在我的集合上执行
。Where()
,它将变成IEnumerable
,而不是HashSet
。因此,首先将其声明为hashset是毫无意义的。.AsQueryable()
与将人员显式定义为iqueryable
之间有什么区别吗?如果我的lambda不能翻译成SQL,会发生什么情况?@Johan这两种语言之间没有区别-AsQueryable
仅仅意味着你可以使用var persons
。如果有些筛选器无法转换为Sql,则必须在调用ToList()
后应用这些筛选器。您必须构建一些测试来确定哈希集是否对此有好处,但我认为这可能不值得。我最初的想法是仅在比较两个键列表时使用哈希集,以将算法的复杂性从O(N^2)
降低到O(N)
。也许我应该创建键列表的哈希集,并保持其他部分不变(基于您的示例)?
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();