2

私は風と API コントローラーを使用して項目のリストをロードするさまざまな方法を試しましたが、フィルタを使用して (一部はカスタム オブジェクトを使用し、別の部分は ODataQueryOptions を使用して)、実際に成功したものはありませんでした。

JavaScript でのテスト コード:

    function test() {
        EntityQuery
            .from("Products")
            /*
            .withParameters({
                filters: [
                { column: "Name", value: "12" }
            ]})
            */
            .orderBy("Name desc")
            .skip(30)
            .take(15)
            .inlineCount(true)
            .using(manager)
            .execute()
            .then(success)
            .fail(fail);

        function success(data) {
            console.log(data.products);
            console.log(data.inlineCount);
        }
        function fail(error) {
            console.log(error.message);
        }
    };
    test();

理想的には、次のようなものを使用してこれを達成したいと考えています:

public IQueryable<Product> Products([FromUri] FilterObject[] filters, ODataQueryOptions odataQueryOptions)
        {
            var result = DummyData.GetProducts();            
            //var totalRowCount = result.Count();

            return result;
        }

データは別の場所で (nHibernate を使用して) フィルタリングされます。フィルターなどの解析に使用される部分を削除しました。ただし、他のレイヤーが合計行数を返すため、これは機能しません。

だから私はそれを次のように置き換えようとしました:

public QueryResult Products([FromUri] FilterObject[] filters, ODataQueryOptions odataQueryOptions)
{
...
        return new QueryResult
            {
                InlineCount = totalRowCount,
                Results = result
            };
}

これによりエラーがスローされます: コントローラー 'Product' のアクション 'Products' の戻り値の型 'Breeze.WebApi.QueryResult' が IEnumerable を実装していないため、EDM モデルを作成できません。

ODataQueryOptions 変数を削除すると、エラーは消えます。検索しても貴重なフィードバックは得られませんでした。

私はこれを試しました:

public PageResult<Product> Products([FromUri] FilterObject[] filters, ODataQueryOptions odataQueryOptions)
{
....
    return new PageResult<Product>(result, null, totalRowCount);  
}

これはエラーをスローしません。返されたデータ オブジェクトを開くと、値が定義されていない inlineCount パラメータが含まれます。実際のデータは、ネストされた結果配列 (Count、Items、および NextPageLink) の最初の項目にあります。

これがこれを機能させる唯一の方法ですか?

ODataQueryOptions をパラメーターとして TodoLists メソッドに追加することにより、これは、breeze の NoDb サンプルで再現できます。

    // GET ~/breeze/BreezeTodo/TodoList
    [HttpGet]
    public IQueryable<TodoList> TodoLists(ODataQueryOptions odataQueryOptions)
    //public IQueryable<TodoList> TodoLists()
    {
        var result = _repository.TodoLists;
        result = result.OrderByDescending(t => t.TodoListId);

        return result;
    }

使用する

        return breeze.EntityQuery
            .from("TodoLists")
            .inlineCount(true)
            .skip(0).take(15)
            .using(manager).execute()
            .then(getSucceeded)
            .fail(getFailed);

リクエストは次のようになります。

GET /breeze/Todo/TodoLists?$top=15&$inlinecount=allpages HTTP/1.1

ODataQueryOptions を使用したフィドルの結果:

[{"$id":"1","$type":"NoDb.Models.TodoList, NoDb","TodoListId":1,"Title":"Before work","Todos":[{"$id":"2","$type":"NoDb.Models.TodoItem, NoDb","TodoItemId":1,"Title":"Make coffee","IsDone":false,"TodoListId":1,"TodoList":{"$ref":"1"}},{"$id":"3","$type":"NoDb.Models.TodoItem, NoDb","TodoItemId":2,"Title":"Turn heater off","IsDone":false,"TodoListId":1,"TodoList":{"$ref":"1"}}]}]

そしてなし:

{"$id":"1","$type":"Breeze.WebApi.QueryResult, Breeze.WebApi","Results":[{"$id":"2","$type":"NoDb.Models.TodoList, NoDb","TodoListId":1,"Title":"Before work","Todos":[{"$id":"3","$type":"NoDb.Models.TodoItem, NoDb","TodoItemId":1,"Title":"Make coffee","IsDone":false,"TodoListId":1,"TodoList":{"$ref":"2"}},{"$id":"4","$type":"NoDb.Models.TodoItem, NoDb","TodoItemId":2,"Title":"Turn heater off","IsDone":false,"TodoListId":1,"TodoList":{"$ref":"2"}}]}],"InlineCount":1}
4

1 に答える 1