如何在运行fluent-mongo时获得“真正的”mongo查询

时间:2011-11-15 14:06:38

标签: c# mongodb mongodb-.net-driver fluent-mongo

运行我的应用程序时,我必须写入使用的屏幕原始查询。

是否可以使用任何方法/扩展方法:

IQueryable alldata = hr.GetCollection"EventsReceiver").AsQueryable().Where(q => q.UserId == "123");

类似于:

db.EventsReceiver.find({ "userid" : "123" });

2 个答案:

答案 0 :(得分:0)

对于有同样问题的人,我会在这里重新发布Craig在github上的回答:

var queryObject = ((IMongoQueryable)alldata).GetQueryObject();

这应该会返回用于生成查询的对象。

答案 1 :(得分:0)

从FluentMongo v1.2.0.0开始,没有公开的方式来公开查询(太可悲了)。这是一个脏的扩展方法来实现它。

但是,因为这是使用反思来获取非公开成员,所以不要指望它将来会发挥作用。

public static class MongoQueryableExtensions
{
    public static BsonDocument GetMongoQuery<T>(this IQueryable<T> query)
    {
        if(query == null) throw new ArgumentNullException("query");
        Assembly fluentMongoAssembly = typeof(FluentMongo.Linq.MongoCollectionExtensions).Assembly;
        Type mongoQueryableType = fluentMongoAssembly.GetType("FluentMongo.Linq.IMongoQueryable");

        BsonDocument queryDocument = null;
        if(mongoQueryableType.IsAssignableFrom(query.GetType()))
        {
            MethodInfo m = mongoQueryableType.GetMethod("GetQueryObject");
            object queryObject = m.Invoke(query, null);

            PropertyInfo queryProperty = fluentMongoAssembly.GetType("FluentMongo.Linq.MongoQueryObject").GetProperty("Query");
            queryDocument = (BsonDocument)queryProperty.GetValue(queryObject, null);
        }
        return queryDocument;
    }
}