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