CosmosDB LINQ查询搭配ContinuationToken时的ORDER BY异常问题
CosmosDB LINQ查询带ORDER BY时续令牌分页报错问题
使用LINQ查询CosmosDB时遇到异常:移除ORDER BY子句后分页查询正常,但添加ORDER BY后,第二次查询传入continuationToken会抛出语法错误异常。
续令牌(已截断部分内容)
[ { "compositeToken": { "token":"+RID:~njgzAO5qBgzIGQAAAAAACA...", "range": { "min": "", "max": "05C1E0" } }, "orderByItems": [ { "item": 74.80897 } ], "rid": "njgzAO5qBgzIGQAAAAAACA==", "skipCount": 0, "filter": "true" } ]
异常信息
Response status code does not indicate success:
BadRequest (400); Substatus: 0;
ActivityId: 5a692073-43db-4050-a856-d3d7cae01503;
Reason: ({"errors":[{"severity":"Error","location":{"start":245,"end":246},"code":"SC1001","message":"Syntax error, incorrect syntax near ','."]}
ActivityId: 5a692073-43db-4050-a856-d3d7cae01503, Microsoft.Azure.Cosmos.Tracing.TraceData.ClientSideRequestStatisticsTraceDatum, Windows/10.0.22621 cosmos-netstandard-sdk/3.31.4);
创建IQueryable的方法代码
private async Task<IQueryable<TDatabase>> _GetQuery(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> orderByExpression, bool disc, TDatabase s, PagedItem pagedItem = null, Expression<Func<T, object>> orderThenByExpressionPaged = null, bool pagedDesc = false) { await Task.CompletedTask; var queryDefinition = container.GetItemLinqQueryable<TDatabase>(continuationToken: pagedItem.ContinuationToken);//, linqSerializerOptions: LinqOptions); IQueryable<TDatabase> queryable = queryDefinition.Where(a => true); Expression<Func<TDatabase, bool>> predicateDb = mapper.Map<Expression<Func<TDatabase, bool>>>(predicate); Expression<Func<TDatabase, object>> orderByExpressionDB = mapper.Map<Expression<Func<TDatabase, object>>>(orderByExpression); if (predicateDb != null) { queryable = queryable.Where<TDatabase>(predicateDb); } IOrderedQueryable<TDatabase> OrderBy = null; if (orderByExpression != null) { if (disc) OrderBy = queryable.OrderByDescending(orderByExpressionDB); else OrderBy = queryable.OrderBy(orderByExpressionDB); queryable = OrderBy; } if (orderThenByExpressionPaged != null) { Expression<Func<TDatabase, object>> orderByExpressionThenByDB = mapper.Map<Expression<Func<TDatabase, object>>>(orderThenByExpressionPaged); if (pagedDesc) OrderBy = OrderBy.ThenByDescending(orderByExpressionThenByDB); else OrderBy = OrderBy.ThenBy(orderByExpressionThenByDB); queryable = OrderBy; } return queryable; }
调试时移除ContinuationToken,查询可正常执行,但会返回之前的重复结果。
内容的提问来源于stack exchange,提问作者Leonardo Medori
相关产品推荐
相关产品推荐

