使用本地方法从DocumentDB查询数据

时间:2016-12-08 12:28:01

标签: linq iqueryable azure-cosmosdb

我的基础存储库中有以下功能

    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子句?

1 个答案:

答案 0 :(得分:3)

  

但是,我在假设一旦调用.AsEnumerable()查询进入数据库时​​是否正确

不完全。

当此方法返回时,它将不会命中数据库 AsEnumerable()不会强制查询执行 - 它基本上只是转换为IEnumerable<T>

你说第一个Where在数据库中执行而第二个Where在客户端执行是正确的,但“返回它匹配的所有内容”表明它是批量完成的 - 它是可能是,但也可能是流式传输。客户端Where肯定会流式传输,但IQueryable<T>实现是否急切地获取所有内容都是实现细节。

如果您真的只对数据库中的哪些过滤器感兴趣,哪些过滤器属于本地过滤器,那么您就是正确的。