0

シーケンスには、System.Web.HttpのSystem.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable`1 source)の複数の要素が含まれています。 .OData.Builder.ODataConventionModelBuilder.DiscoverInheritanceRelationships()..。

これが私のバインディングコードです:

var modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<PeopleDto>("People");

これが私のコントローラーコードです:

[Queryable]
public IEnumerable<PeopleDto> Get(
        [FromUri] Credentials credentials, 
        ODataQueryOptions<PeopleDto> options, 
        int departmentId,
        DetailLevel detail = DetailLevel.Low)
{
    var count = _repository.Filter(x => x.DepartmentId == departmentId && x.Active);
    options.ApplyTo(count);
    int total = count.Count();

    switch (detail)
    {
        case DetailLevel.Low:
            return new Paginable<PeopleDto>(GetMyPeopleLo(departmentId, options), total);
        // [...]
    }
}

Paginable<T>を実装しIEnumerable<T>ます。また、GetMyPeopleLo()(本名ではなく)メソッドは、オプションを追加のクエリに適用します。(ページネーションコードの場所を移動したので、追加のクエリはもう必要ありませんが、その部分はまだリファクタリングしていません)。

これは、プレリリースバージョンのoDataに問題があるケースの1つですか?

更新:属性をコメントアウトするQueryableと機能するように見えますが、オプションがクエリに適用されるときに、クエリ文字列で指定したフィルターは実際には適用されませんcount

4

2 に答える 2

3

ここでいくつかのことが飛び出します:

  • [Queryable]とODataQueryOptionsを使用しないでください。それらは同じことをするために使用されます。この場合、ODataQueryOptionsの方が適切と思われるため、[Queryable]を削除する必要があります。
  • クエリの結果を使用していません。これの代わりに

    var count = _repository.Filter(x => x.DepartmentId == departmentId && x.Active);
    options.ApplyTo(count);
    int total = count.Count();
    

    あなたはこれを書くべきです:

    var count = _repository.Filter(x => x.DepartmentId == departmentId && x.Active);
    var queryResults = options.ApplyTo(count) as IQueryable<PeopleDto>;
    int total = queryResults.Count();
    

    そうすれば、合計でODataクエリオプションが考慮されます。

  • PageResult<T>ODataフォーマッタはカウントを取得し、ODataフィードに正しく挿入するため、Paginableの代わりに使用することを検討してください。

于 2013-02-07T14:54:01.100 に答える