这个过滤器在内存中对吗?

时间:2011-11-29 18:24:00

标签: linq entity-framework

我只是想确保我理解正确...

search是一个包含查询字符串的对象。

Repo.Query会返回ObjectQuery<T>

根据我的理解,链接的linq语句将在实体框架返回满足查询的所有行之后过滤结果。所以所有的行都被返回,然后在内存中进行过滤。所以我们返回了一堆我们并不想要的数据。返回大约有10k行,所以这很重要。就像让我的困惑得到澄清。

var searchQuery = Repo.Query(search)
                .Where(entity =>
                        entity.Prop1.ToUpper().Equals(prop1.ToUpper()) &&
                        entity.Prop2.ToUpper().Equals(prop2.ToUpper()))
                .OrderBy(entity => Repo.SortExpression ?? entity.prop1);

2 个答案:

答案 0 :(得分:1)

您的Repo.Query(string query)函数应返回IQueryable<T>

然后您可以在不先获取所有行的情况下进行过滤和排序。

IQueryable(Of T) Interface

希望这会有所帮助

答案 1 :(得分:1)

如果是SQL,这很可能会在服务器上而不是在内存中创建SQL查询和过滤器。

事实上,上述陈述实际上并没有做任何事情。 只有当你迭代它时才会执行查询。这就是为什么某些提供程序(如EF to SQL one)可以将表达式树折叠为SQL查询。

最简单的检查方法是使用LINQPAD或SQL Profiler查看实际执行的查询。