如何获得“真实”的体验?运行 Fluent-mongo 时的 mongo 查询

发布于 2024-12-15 18:56:55 字数 277 浏览 1 评论 0原文

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

是否有任何方法/扩展方法可用,可以从中获取:

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

类似于:

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

When running my application I have to write to screen raw query used.

Is any method/extension method available, to get from this:

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

something similar to:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

挽手叙旧 2024-12-22 18:56:55

从 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;
    }
}

From FluentMongo v1.2.0.0, there's no public way to expose the query (so sad). Here's a dirty extension method to get at it.

BUT since this is using reflection to get at non-public members don't expect that it will necessarily work in the future.

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;
    }
}
尐偏执 2024-12-22 18:56:55

对于任何有相同问题的人,我将在 github 上重新发布克雷格的答案:

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

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

For anyone having same question I'll repost here Craig's answer on github:

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

this should give you back the object used to generate the query.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文