是否有可能使用 lambda 表达式对 MongoDB 结果进行排序
Is there any possibility to sort MongoDB results using a lambda expression
我有一个具有多个实现的接口,其中一个实现正在使用 Mongo 数据库。我尝试实现的方法有一个 lambda 表达式参数,我需要用它来对 MongoDB 中找到的数据进行排序。对于排序,MongoDB 需要 SortDefinition,但我只有 lambda 表达式。 我能以某种方式将此 lambda 表达式转换为 SortDefinition 吗?
public IEnumerable<Car> GetDataSorted(Expression<Func<Car,string>> sortCriteria)
{
var result = _mongoDBCollection.Find(filterCriteria);
return result.sort(sortCriteria).ToList();
}
对于此特定代码,我收到一条错误消息,指出无法将 lambda 表达式转换为 SortDefinition。
您可以阅读 Expression
以获取字段名称,然后将您的 sortDefinition 构建为 BsonDocumentSortDefinition<T>
:
var body = sortCriteria.Body.ToString();
var parameter = sortCriteria.Parameters.First() + ".";
var fieldPath = body.Substring(parameter.Length);
SortDefinition<Car> sortDefinition = new BsonDocumentSortDefinition<Car>(
new BsonDocument(){ { fieldPath, 1 } });
return result.Sort(sortDefinition).ToList();
它适用于以下情况:
r.GetDataSorted(c => c.Name); // evaluates to Name
r.GetDataSorted(car => car.Name); // evaluates to Name
r.GetDataSorted(car => car.Nested.Field); // evaluates to Nested.Field
我有一个具有多个实现的接口,其中一个实现正在使用 Mongo 数据库。我尝试实现的方法有一个 lambda 表达式参数,我需要用它来对 MongoDB 中找到的数据进行排序。对于排序,MongoDB 需要 SortDefinition,但我只有 lambda 表达式。 我能以某种方式将此 lambda 表达式转换为 SortDefinition 吗?
public IEnumerable<Car> GetDataSorted(Expression<Func<Car,string>> sortCriteria)
{
var result = _mongoDBCollection.Find(filterCriteria);
return result.sort(sortCriteria).ToList();
}
对于此特定代码,我收到一条错误消息,指出无法将 lambda 表达式转换为 SortDefinition。
您可以阅读 Expression
以获取字段名称,然后将您的 sortDefinition 构建为 BsonDocumentSortDefinition<T>
:
var body = sortCriteria.Body.ToString();
var parameter = sortCriteria.Parameters.First() + ".";
var fieldPath = body.Substring(parameter.Length);
SortDefinition<Car> sortDefinition = new BsonDocumentSortDefinition<Car>(
new BsonDocument(){ { fieldPath, 1 } });
return result.Sort(sortDefinition).ToList();
它适用于以下情况:
r.GetDataSorted(c => c.Name); // evaluates to Name
r.GetDataSorted(car => car.Name); // evaluates to Name
r.GetDataSorted(car => car.Nested.Field); // evaluates to Nested.Field