2

ページングラッパーを作成する拡張メソッドにこのロジックがあります。

        int total = 0;
        if (query is IRavenQueryable<T>)
        {
            RavenQueryStatistics stats;
            var rQuery = (IRavenQueryable<T>)query;
            rQuery.Statistics(out stats);
            total = stats.TotalResults;
        }
        else
        {
            total = query.Count();
        }

私の問題は、raven クエリを実行すると、デバッグ中にrQueryにカーソルを合わせて結果を展開しようとしない限り、 stats.TotalResultsがゼロになることです。

ここで何が間違っていますか?レイヴンに必要な結果を一貫して与えるにはどうすればよいですか?

メソッド全体は次のとおりです。

    public static PagingModel<T> Page<T>(this IEnumerable<T> query, int page, int count)
    {
        if (page < 1)
            throw new ArgumentOutOfRangeException("Page is one-based and must be greater than zero");

        int total = 0;
        if (query is IRavenQueryable<T>)
        {
            RavenQueryStatistics stats;
            var rQuery = (IRavenQueryable<T>)query;
            rQuery.Statistics(out stats);
            total = stats.TotalResults;
        }
        else
        {
            total = query.Count();
        }

        var results = query
            .Skip((page - 1) * count)
            .Take(count)
            .ToArray();

        return new PagingModel<T>()
        {
            Page = page,
            Rows = results,
            Total = total /count
        };
    }
4

1 に答える 1

4

私は自分でそれを理解しました。RavenQueryStatisticsは参照によってTotalResultsを設定し、合計は結果が解決された後にのみ利用可能であることが判明しました。(もともと、DB への別の旅行をしたと思っていました。)

    public static PagingModel<T> Page<T>(this IEnumerable<T> query, int page, int count)
    {
        RavenQueryStatistics stats = null;
        if (page < 1)
            throw new ArgumentOutOfRangeException("Page is one-based and must be greater than zero");

        if (query is IRavenQueryable<T>)
        {
            var rQuery = (IRavenQueryable<T>)query;
            rQuery.Statistics(out stats);
        }

        var results = query
            .Skip((page - 1) * count)
            .Take(count)
            .ToArray();
        var total = stats == null ? query.Count() : stats.TotalResults;
        return new PagingModel<T>()
        {
            Page = page,
            Rows = results,
            TotalPages = (int)Math.Ceiling((double)total / (double)count)
        };
    }
于 2012-05-20T17:28:45.063 に答える