数据库
首页 > 数据库> > c#-获取总结果计数并允许在与MongoDB的同一查询中进行分页

c#-获取总结果计数并允许在与MongoDB的同一查询中进行分页

作者:互联网

我将查询设置为允许分页.在执行此操作的同时,我必须基本上运行两次相同的查询,以获取该查询的总匹配结果并允许分页.有什么办法可以将其组合成一个查询?

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
    };
}

解决方法:

首先,要获得计数,您不应该执行linq查询,然后对结果进行计数.这种方法会枚举所有结果,然后对它们进行计数,这非常昂贵.您应该改用:

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

此Count方法是在MongoCursor本身上定义的,它将以mongo而不是您的.Net应用程序中对结果进行计数.

我想那是问题背后的真正问题.但是,如果您仍然希望将这两个查询结合起来,可以这样进行:

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时,它将在应用程序中而不是在数据库中进行过滤,因此您应该将查询更改为以下查询:

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

标签:mongodb,mongodb-net-driver,linq,c,net
来源: https://codeday.me/bug/20191030/1964508.html