Как получить «настоящий» запрос на монго при запуске fluent-mongo - PullRequest
0 голосов
/ 15 ноября 2011

При запуске приложения мне нужно записать на экран необработанный запрос.

Доступен ли любой метод / метод расширения, чтобы получить из этого:

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

что-то похожее на:

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

Ответы [ 2 ]

0 голосов
/ 09 января 2012

В 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;
    }
}
0 голосов
/ 22 ноября 2011

Для тех, у кого есть такой же вопрос, я опубликую здесь ответ Крейга на github:

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

это должно вернуть вам объект, использованный для генерации запроса.

...