2017-04-02 13 views
0

次のコードは、のASP.NETコアMicrosoft.Azure.DocumentDB.Core(バージョン1.2.1)パッケージとLINQを使用してDocumentDbデータベースに対してクエリを作成するAPI用のコードです。DocumentDb .NET Core SDK - IQueryable.OrderByが無効なクエリを生成する

ただし、生成クエリは無効です。

public async Task<IEnumerable<T>> QueryAsync 
    (Expression<Func<T, bool>> predicate, string orderByProperty) 
{ 
    client.CreateDocumentQuery<T>(myCollectionUri) 
     .Where(predicate) 
     .OrderBy(x => orderByProperty) 
     .AsDocumentQuery(); 

    /* rest of the code... */ 
} 

// And I call it: 
await repository.QueryAsync<Book>(x => x.Author == "Joe", "Price"); 

// class Book is a POCO with 3 properties: string Title, string Author, and decimal Price 

/* 
INVALID generated query: 
    SELECT * FROM root WHERE (root["Author"] = "Joe") ORDER BY "Price" 

Correct query: 
    SELECT * FROM root WHERE (root["Author"] = "Joe") ORDER BY root["Price"] 
*/ 

この動作は変更できますか?

はたぶんIQueryable<T>に拡張メソッドを書くと、このようにそれを呼び出すことにより:

client.CreateDocumentQuery<T>(myCollectionUri) 
    .Where(predicate) 
    .DocumentDbOrderBy(orderByProperty) // new extension method 
    .AsDocumentQuery(); 
+0

をあなたがそれをしたいときに 'OrderBy'はまだ、' AuthorId'が含まれていないのはなぜ「価格」と一緒にいること。また、生成されたクエリについて心配するのではなく、 'Price Asc'で間違った結果が出ることを示唆できますか? –

+0

@MrinalKamboj実際のシナリオに基づいてサンプルを作成しました。ちょうど質問を編集しました – Poulad

答えて

0

私はダイナミックLINQを使用してこの問題を解決しました。

は私のリポジトリクラスにusingステートメントを追加しました:

using System.Linq.Dynamic.Core; 

そして方法の小さな変化:

public async Task<IEnumerable<T>> QueryAsync 
    (Expression<Func<T, bool>> predicate, string orderByProperty) 
{ 
    client.CreateDocumentQuery<T>(myCollectionUri) 
     .Where(predicate) 
     .OrderBy(orderByProperty) // uses dynamic LINQ 
     .AsDocumentQuery(); 

    /* rest of the code... */ 
} 
関連する問題