私は風と 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}