首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用泛型在DocumentDB的Linq中创建多个/嵌套的SelectMany连接

如何使用泛型在DocumentDB的Linq中创建多个/嵌套的SelectMany连接
EN

Stack Overflow用户
提问于 2018-06-09 19:25:45
回答 1查看 171关注 0票数 0

我正在尝试将一个方法添加到文档Db的泛型存储库。

我希望它产生的SQL看起来像这样(但通用):

代码语言:javascript
复制
SELECT VALUE c FROM c
JOIN versions IN c["versions"] 
JOIN groups IN versions["userGroups"] 
JOIN users IN groups["users"] 
WHERE c.type = "Approval" and users["userId"] = "xxx"

我试过了..。

代码语言:javascript
复制
public async Task<ListResult<TResult>> SelectManyAsync<TEntity1, TEntity2, TEntity3, TEntity4, TResult>(Expression<Func<TEntity1, bool>> condition01, Expression<Func<TEntity1, IEnumerable<TEntity2>>> condition02, Expression<Func<TEntity2, IEnumerable<TEntity3>>> condition03, Expression<Func<TEntity3, IEnumerable<TEntity4>>> condition04, Expression<Func<TEntity4, bool>> condition05) where TEntity1:class
        {
            var feedOptions = GetFeedOptions();

            var query = DocumentDbContext.Client.CreateDocumentQuery<TEntity1>(DocumentDbContext.DocumentCollection.DocumentsLink, feedOptions)
                .Where(condition01)
                .SelectMany(condition02)
                .SelectMany(condition03)
                .SelectMany(condition04)
                .Where(condition05)
                .AsDocumentQuery();

// .. removed code for brevity

}

其结果如下所示:

代码语言:javascript
复制
SELECT VALUE tmp FROM root 
JOIN tmp IN root["versions"] 
JOIN tmp IN tmp["userGroups"] 
WHERE (true AND (tmp["userId"] = "xxx"))

但是我得到了一个错误:

在FROM子句中多次指定了输入集名或别名'tmp‘。

有没有可能使用泛型来创建这样的东西,以及我们如何为"tmp“指定不同的值。或者这不是正确的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-10 03:45:47

不确定是不是这个bug,bug这样的查询不会工作。您需要使用嵌套的selectMany。

下面的例子应该可以用:

代码语言:javascript
复制
public async Task<IEnumerable<TRes>> Query<T, TRes>(
        string docCollection,
        string partitionKey,
        Func<IOrderedQueryable<T>, IQueryable<TRes>> func,
        string continuationToken = null)
    {
        var queryable =
            CosmosClient.CreateDocumentQuery<T>(
                CollectionUri(docCollection),
                new FeedOptions
                {
                    MaxItemCount = 100,
                    RequestContinuation = continuationToken,
                    EnableCrossPartitionQuery = false,
                    PartitionKey = new PartitionKey(partitionKey),
                    PopulateQueryMetrics = true,
                });

        return await func(queryable).AsDocumentQuery().ExecuteNextAsync<TRes>();
    }


await Query<Doc, string>("collection", "pk",
            (IOrderedQueryable<Doc> x) => x.SelectMany(p => p.Versions.SelectMany(d => d.UserGroups.SelectMany(k => k.Users.Select(u => u.Name)))));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50773769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档