我正在尝试将一个方法添加到文档Db的泛型存储库。
我希望它产生的SQL看起来像这样(但通用):
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"
我试过了..。
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
}
其结果如下所示:
SELECT VALUE tmp FROM root
JOIN tmp IN root["versions"]
JOIN tmp IN tmp["userGroups"]
WHERE (true AND (tmp["userId"] = "xxx"))
但是我得到了一个错误:
在FROM子句中多次指定了输入集名或别名'tmp‘。
有没有可能使用泛型来创建这样的东西,以及我们如何为"tmp“指定不同的值。或者这不是正确的方法?
发布于 2018-06-10 03:45:47
不确定是不是这个bug,bug这样的查询不会工作。您需要使用嵌套的selectMany。
下面的例子应该可以用:
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)))));
https://stackoverflow.com/questions/50773769
复制相似问题