我的基础存储库中有以下功能
public IEnumerable<T> GetAll(ClaimsPrincipal user)
{
return client.CreateDocumentQuery<T>(collectionLink)
.Where(doc => doc.Type == DocType)
.AsEnumerable()
.Where(doc =>
doc.Owner == user.Id()
|| user.InGroup(doc.Owner)
|| doc.Public);
}
我在ClaimsPrincipal类上有两个扩展方法。 Id()
只返回.FindFirst("user_id").Value
和.InGroup(<id>)
检查用户是否拥有拥有该文档的组的成员资格。
但是,我正确地假设一旦我调用.AsEnumerable()
查询进入只有第一个where子句的数据库,返回它匹配的所有内容,然后在客户端执行第二个where子句?
答案 0 :(得分:3)
但是,我在假设一旦调用.AsEnumerable()查询进入数据库时是否正确
不完全。
当此方法返回时,它将不会命中数据库 。 AsEnumerable()
不会强制查询执行 - 它基本上只是转换为IEnumerable<T>
。
你说第一个Where
在数据库中执行而第二个Where
在客户端执行是正确的,但“返回它匹配的所有内容”表明它是批量完成的 - 它是可能是,但也可能是流式传输。客户端Where
肯定会流式传输,但IQueryable<T>
实现是否急切地获取所有内容都是实现细节。
如果您真的只对数据库中的哪些过滤器感兴趣,哪些过滤器属于本地过滤器,那么您就是正确的。