如何使用LINQ对MongoCollection <t> .AsQueryable()进行mongodb结果排序?</t>

时间:2014-01-30 23:19:37

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

我使用MongoDB来存储可以包含可变数量的用户定义索引值的实体。每个索引都可以包含一个或多个值,因此对于用户定义的索引,我使用对象列表来存储值。

public class Entity
{
    public IDictionary<string, IList<object>> Indices { get; set; }
    // ...
}

我编写了一个存储库类,它支持通过传递自定义条件列表来查询实体,并且存储库使用IMongoQuery类构建MongoDB.Driver.Builders.Query的实例,并返回IQueryable<Entity>

public IQueryable<Entity> GetAll(IEnumerable<SearchCriterion> criteria)
{
    IMongoQuery query = BuildQuery(criteria);

    //https://jira.mongodb.org/browse/CSHARP-461
    //return _db.GetCollection<Entity>().Find(query).AsQueryable();

    return _db.GetCollection<Entity>()
        .AsQueryable()
        .Where(x => query.Inject());
}

由于此处描述的问题https://jira.mongodb.org/browse/CSHARP-461我选择不使用MongoCursor.AsQueryable(),因为MongoCursor实现了IEnumerable。结果是。返回的IQueryable<Entity>上使用的任何表达式都不在服务器上完成,它在客户端的内存中完成。相反,我按照建议将查询注入MongoCollection<T>.AsQueryable()结果。

所以,上面的解决方案效果很好,但现在我想通过使用OrderBy()接口调用IMongoSortBy来做同样的事情来对结果进行排序,就像这样。

return _db.GetCollection<Entity>()
    .AsQueryable()
    .Where(x => query.Inject())
    .OrderBy(x => sortBy.Inject());

但是,IMongoSortBy接口上没有实现Inject()

如果我使用MongoCursor,这很容易

return _db.GetCollection<Entity>()
    .Find(query).
    .SetSortOrder(sortBy)
    .AsQueryable();

那么,有没有办法可以使用MongoCollection<T>.AsQueryable()调用对实体进行排序?

0 个答案:

没有答案