Breeze を Web API バックエンドで使用しており、受信した OData クエリ オプションを適切に適用する方法を見つけようとしていますが、指定された OData クエリの inlineCount を返そうとしています。
私がこれをやろうとしている理由は、別のデータソースにアクセスし、返されるエンティティの関連するプロパティを入力する必要があるためです (すべてページングと並べ替えを許可しながら)。
これが私がやろうとしていることの例です:
[HttpGet]
public QueryResult Reservations( ODataQueryOptions options ) {
var set = _contextProvider.Context.Reservations.Where(r => r is ScheduledReservation || r is PoolReservation).Include(i => i.ReservationType)
.Include(i => i.Vehicle)
.Include(i => i.Vehicle.VehicleMake)
.Include(i => i.Vehicle.VehicleModel).AsQueryable();
var queryable = Breeze.WebApi.QueryHelper.ApplyQuery(set, options, new ODataQuerySettings { EnableConstantParameterization = true, EnsureStableOrdering = true, HandleNullPropagation = HandleNullPropagationOption.Default });
// Hit other data source here and fill in associated properties on returned entities
return new QueryResult
{
InlineCount = // Would like to get at breeze's execution of this query,
Results = queryable.Cast<Reservation>()
};
}
Breeze が inlineCount を実行して返すことを可能にしながら、Queryable にクエリ オプションを手動で適用するにはどうすればよいですか?
私が上でやっていることの問題は3つあります。
1) これは、このアクション メソッドが IEnumerable<> を実装するものではなく、QueryResult を返すため、Breeze が EDM モデルを作成できないというエラーをスローしています。
2) ApplyTo() がまだ許可されていないネストされたプロパティでソートしたいので、ODataQueryOptions オブジェクトの ApplyTo() の代わりに Breeze の ApplyQuery() メソッドを使用しています。Breeze の機能を掘り下げて手動で ApplyQuery() メソッドを呼び出すことで、限界を超えているかどうかはわかりません。
3) Breeze の ApplyQuery メソッドを呼び出すときに、inlineCount を取得するためのクエリが実行されていることを EF Profiler で確認できます。ApplyQuery メソッドが、ODataQueryOptions オブジェクトの inlineCount を MS_InlineCount のキーを持つプロパティとして設定していることを発見しました。したがって、それを取得するための「簡単な」方法があるようには見えません (むしろ、ODataQueryOptions プロパティ配列からそれを引き出すのはばかげているようです)。
私が質問している最も重要な理由は、この考え方全体がぎこちなく感じられるからです。OData クエリを DbSet に簡単に適用し、inlineCount を返すことを可能にする (そして適切なページングと並べ替えを可能にする) ものを見落としていないことを再確認したいと思います。