Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF中的HashSet过滤_C#_Asp.net_Entity Framework - Fatal编程技术网

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();