将OrderBy子句添加到DocumentDB LINQ查询会破坏它(C#)

时间:2017-03-08 22:16:39

标签: c# .net linq azure azure-cosmosdb

我使用带有LINQ的.net核心1.0.1中的C#中的Azure Documents SDK来抽象一个以lambdas为参数的简单Fetch方法。除了我添加一个ORDER BY子句之外,它工作得很好 - 尽管我不知道为什么。这是方法:

public async Task<IEnumerable<T>> Fetch<R>(Expression<Func<T, bool>> predicate, Expression<Func<T, R>> orderby, int count)
{
    var results = new List<T>();
    var collectionLink = UriFactory.CreateDocumentCollectionUri(_config.Database, _collectionId);

    // This works
    //var document = _client.CreateDocumentQuery<T>(collectionLink).Where(predicate).Take(count).AsDocumentQuery();

    // This ** DOESN'T ** work
    var document = _client.CreateDocumentQuery<T>(collectionLink).Where(predicate).OrderBy(orderby).Take(count).AsDocumentQuery();

    var feedResponse = await document.ExecuteNextAsync<T>();
    results.AddRange(feedResponse.AsEnumerable<T>());
    return results;
}

添加.OrderBy()方法后,返回0结果。删除后,我得到预期的10(尽管按插入顺序)。在查看由.AsDocumentQuery()方法生成的SQL时,我看不出任何明显错误的内容,所以我有点不知道为什么。 为了完整起见,这是一个“使用......

的例子
var result = data.Fetch(f => f.Firstname.Contains("i"), x => x.Firstname, 10);

...以及它产生的查询:

SELECT TOP 10 * FROM root WHERE CONTAINS(root["Firstname"], "i") ORDER BY root["Firstname"] ASC

这是一个SDK错误还是我错过了一些明显的东西?

谢谢!

1 个答案:

答案 0 :(得分:1)

每当我看到这样的奇怪行为时,通常是因为你有一个哈希索引(默认值)而不是该字段上的范围索引。检查集合的索引策略。