获取总结果计数并允许使用MongoDB在同一查询中进行分页

时间:2014-01-08 15:47:21

标签: c# .net linq mongodb mongodb-.net-driver

我将我的查询设置为允许分页。虽然这有效,但我必须基本上运行相同的查询两次以获得查询的总匹配结果并允许分页。有没有办法将它组合成一个查询?

public SearchResult GetResults()
{
    //query is built elsewhere
    var totalResults = (from i in Collection.Find(query)
        select i).Count();

    var results = (from i in Collection.Find(query)
        select i)
        .Skip(recordsToSkip)
        .Take(recordsToTake)
        .ToList();

    //SearchResult is defined elsewhere
    return new SearchResult
    {
        Results = results,
        TotalResults = totalResults
    };
}

1 个答案:

答案 0 :(得分:4)

首先,要获得计数,您不应该执行linq查询,然后计算结果。这种方式列举了所有结果,然后计算它们,这是昂贵的。你应该使用:

var totalResults = Collection.Find(query).Count()

Count方法在MongoCursor本身上定义,并将在mongo中计算结果,而不是在.Net应用程序中。

我猜这是问题背后的真正问题。但是,如果你仍然想要联合2个查询,你可以这样做:

var results = (from i in Collection.Find(query) select i).ToList();
var totalResults = results.Count();
var page = results
    .Skip(recordsToSkip)
    .Take(recordsToTake)
    .ToList();

这将获得整个集合,计算它,并返回它的页面。我不建议你这样做,因为你不需要整个系列。

P.S:当您在Find的结果上使用Linq时,它会在您的应用程序中而不是在DB中进行过滤,因此您应该将查询更改为此:

var results = Collection.Find(query)
    .SetSkip(recordsToSkip)
    .SetLimit(recordsToTake)
    .ToList();