使用Breeze手动应用OData查询选项并仍然返回InlineCount

时间:2013-09-09 19:55:09

标签: c# entity-framework breeze

我正在使用带有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&lt;&gt;。

2)我正在使用Breeze的ApplyQuery()方法而不是ODataQueryOptions对象的ApplyTo(),因为我还想对ApplyTo()尚不允许的嵌套属性进行排序。我不确定我是否通过深入研究Breeze的功能并手动调用ApplyQuery()方法来超越我的界限。

3)我可以在EF Profiler中看到,在调用Breeze的ApplyQuery方法时,检索inlineCount的查询正在执行。我发现ApplyQuery方法将ODataQueryOptions对象上的inlineCount设置为具有MS_InlineCount键的属性。因此,似乎没有一种“简单”的方法可以实现(相反,对我来说,将它从ODataQueryOptions属性数组中拉出来似乎很棒)。

我问的主要原因是整个思路都很尴尬。我想仔细检查并确保我没有遗漏任何可以让我轻松地将OData查询应用于我的DbSet并仍然允许返回inlineCount(并且仍然允许正确的分页和排序)的东西。

1 个答案:

答案 0 :(得分:1)

我最终偶然发现了解决这个问题的方法。以下文章是让我找到解决上述问题的正确解决方案的原因。

Breeze WebAPI: How to combine QueryResult with ODataQueryOptions to return inlineCount