考虑以下代码
var q = from e in myCollection.AsQueryable<Entity>() where e.Name == "test" select e;
实际的查询非常复杂,我不喜欢使用 QueryBuilder 而不是 LINQ 来构建它。
所以我想将它转换回 IMongoQuery 以在 myCollection.Group() 调用中使用,因为没有通过 LINQ 的 GroupBy 支持。
是否可以?
编辑答案:
我意识到已经有一种官方方法可以从 LINQ 查询中获取 Mongo 查询(我应该知道!)。您必须将 IQueryable<T> 向下转换为 MongoQueryable<T> 才能访问 GetMongoQuery 方法:
var linqQuery = from e in collection.AsQueryable<Entity>() where e.Name == "test" select e;
var mongoQuery = ((MongoQueryable<Entity>)linqQuery).GetMongoQuery();
原答案:
目前还没有官方支持的方法来做到这一点,但在不久的将来,我们确实打算让查找 LINQ 查询映射到的 MongoDB 查询变得容易。
在短期内,您可以使用以下未记录的内部方法来找出 LINQ 查询映射到的 MongoDB 查询:
var linqQuery = from e in collection.AsQueryable<Entity>() where e.Name == "test" select e;
var translatedQuery = (SelectQuery)MongoQueryTranslator.Translate(linqQuery);
var mongoQuery = translatedQuery.BuildQuery();
但是在某些时候,您可能需要从这些未记录的方法切换到官方支持的方法(未记录的方法将来可能会更改或重命名)。
基于 Robert Stam 的回答的快速扩展:
public static IMongoQuery ToMongoQuery<T>(this IQueryable<T> linqQuery)
{
var mongoQuery = ((MongoQueryable<T>)linqQuery).GetMongoQuery();
return mongoQuery;
}
public static WriteConcernResult Delete<T>(this MongoCollection<T> col, IQueryable<T> linqQuery)
{
return col.Remove(linqQuery.ToMongoQuery());
}
public static WriteConcernResult Delete<T>(this MongoCollection<T> col, Expression<System.Func<T, bool>> predicate)
{
return col.Remove(col.AsQueryable<T>().Where(predicate).ToMongoQuery());
}
例子:
myCollection.Remove(myCollection.AsQueryable().Where(x => x.Id == id).ToMongoQuery());
myCollection.Delete(myCollection.AsQueryable().Where(x => x.Id == id));
myCollection.Delete(x => x.Id == id);