我正在使用带有 Web API 后端的 Breeze,我试图弄清楚如何正确应用收到的 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>()
};
}
如何手动将查询选项应用于我的 Queryable,同时仍然允许 Breeze 负责执行和返回 inlineCount?
我上面所做的问题有三个方面:
1) 这会引发错误,指出 Breeze 无法创建 EDM 模型,因为此操作方法返回 QueryResult 而不是实现 IEnumerable<> 的东西。
2) 我正在使用 Breeze 的 ApplyQuery() 方法而不是 ODataQueryOptions 对象的 ApplyTo() 方法,因为我还想对 ApplyTo() 还不允许的嵌套属性进行排序。我不确定是否通过深入研究 Breeze 的功能并手动调用 ApplyQuery() 方法超出了我的界限。
3) 我可以在 EF Profiler 中看到,在调用 Breeze 的 ApplyQuery 方法时正在执行检索 inlineCount 的查询。我发现 ApplyQuery 方法将 ODataQueryOptions 对象上的 inlineCount 设置为键为 MS_InlineCount 的属性。因此,似乎没有一种“简单”的方法可以做到这一点(相反,我将它从 ODataQueryOptions 属性数组中拉出来似乎很不礼貌)。
我问这个问题的首要原因是整个思路让人感觉很尴尬。我想仔细检查并确保我没有错过任何可以让我轻松地将 OData 查询应用到我的 DbSet 并仍然允许返回 inlineCount 的内容(并且仍然允许正确的分页和排序)。