9

考虑以下代码

var q = from e in myCollection.AsQueryable<Entity>() where e.Name == "test" select e;

实际的查询非常复杂,我不喜欢使用 QueryBuilder 而不是 LINQ 来构建它。

所以我想将它转换回 IMongoQuery 以在 myCollection.Group() 调用中使用,因为没有通过 LINQ 的 GroupBy 支持。

是否可以?

4

2 回答 2

18

编辑答案:

我意识到已经有一种官方方法可以从 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();

但是在某些时候,您可能需要从这些未记录的方法切换到官方支持的方法(未记录的方法将来可能会更改或重命名)。

于 2012-04-22T16:01:15.183 回答
1

基于 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);
于 2016-11-13T07:22:52.037 回答