如何使用C#驱动程序以编程方式在MongoDB查询上设置排序字段?

如何使用C#驱动程序以编程方式在MongoDB查询上设置排序字段?,c#,mongodb,linq,sorting,mongodb-query,C#,Mongodb,Linq,Sorting,Mongodb Query,我有一个工具对象的集合,我希望可以选择性地过滤这些对象,并将其返回到网页上的分页表中。我让它与过滤器和分页一起工作,但我在排序方面遇到了问题。我使用的是一个角度材质表,它允许用户在运行时选择排序字段和方向 使用MongoDB C#驱动程序,我构建了一个与过滤器匹配的工具集合(fo=find options=case-sensitive)。Skip和Limit提供分页功能——我知道这对于大型集合来说并不一定有效,这在这里不是一个问题——ToList将其发送到API tools = _tools.F

我有一个工具对象的集合,我希望可以选择性地过滤这些对象,并将其返回到网页上的分页表中。我让它与过滤器和分页一起工作,但我在排序方面遇到了问题。我使用的是一个角度材质表,它允许用户在运行时选择排序字段和方向

使用MongoDB C#驱动程序,我构建了一个与过滤器匹配的工具集合(fo=find options=case-sensitive)。Skip和Limit提供分页功能——我知道这对于大型集合来说并不一定有效,这在这里不是一个问题——ToList将其发送到API

tools = _tools.Find<Tool>(theFilter, fo)
    .Sort(Builders<Tool>.Sort.Descending(x => x.Description))
    .Skip(pageNo * pageSize)
    .Limit(pageSize)
    .ToList();
失败,尝试使用字段名称构建SortDefinition对象时也会失败:

    private SortDefinition<T> BuildSortDefinition<T>(string fieldName, string sortDirection)
    {
        FieldDefinition<T> theField = new StringFieldDefinition<T>(fieldName);
        SortDefinition<T> theSort;

        if (sortDirection.ToLower() == "desc")
            theSort = Builders<T>.Sort.Descending(theField);
        else
            theSort = Builders<T>.Sort.Ascending(theField);

        return theSort;
    }
private SortDefinition BuildSortDefinition(字符串字段名,字符串sortDirection)
{
FieldDefinition of字段=新的StringFieldDefinition(字段名);
排序定义排序;
if(sortDirection.ToLower()=“desc”)
排序=Builders.Sort.Descending(字段);
其他的
排序=Builders.Sort.升序(字段);
返回排序;
}

只有使用lambda表达式,我才能使排序工作。如何修复lambda表达式以使用可配置字段;或者正确使用
.Sort
以使用可配置字段,在这种情况下?

我的问题是搜索字段使用了错误的大小写-“description”而不是“description”。一旦我通过了正确的案例,它就工作得很好。

为了以防万一,我使用的是Mongo v3.4.10,驱动程序是MongoDB.driver v2.9.1。不确定它是否有用,但你可以只做
Builders.Sort.Ascending(fieldName)
而不是使用
StringFieldDefinition
,因为
FieldDefinition
有一个隐式运算符,负责将字符串转换为正确的FieldDefinition类型。不幸的是,它的行为方式完全相同;没有分类。我还为我可能要排序的每个字段添加了索引,但也没有成功。请分析数据库,看看在使用lambda和string字段时,会向mongo发送哪些命令。如果驱动程序没有生成相同的命令,那么这就是驱动程序的问题。在mongo shell中,使用
db.setProfilingLevel(2)
打开评测,然后运行c#代码,然后发出
db.system.profile.find().skip(1).limit(6).sort({ts:-1}).pretty()
,这将显示mongo服务器收到的最后5个查询。谢谢-这为我指明了方向。。。。回答如下。
    private SortDefinition<T> BuildSortDefinition<T>(string fieldName, string sortDirection)
    {
        FieldDefinition<T> theField = new StringFieldDefinition<T>(fieldName);
        SortDefinition<T> theSort;

        if (sortDirection.ToLower() == "desc")
            theSort = Builders<T>.Sort.Descending(theField);
        else
            theSort = Builders<T>.Sort.Ascending(theField);

        return theSort;
    }