運行我的應用程序時,我必須寫入屏幕原始查詢。如何在運行fluent-mongo時獲得「真正的」mongo查詢
任何可用的方法/擴展方法,從這個獲得:
db.EventsReceiver.find({ "userid" : "123" });
運行我的應用程序時,我必須寫入屏幕原始查詢。如何在運行fluent-mongo時獲得「真正的」mongo查詢
任何可用的方法/擴展方法,從這個獲得:
db.EventsReceiver.find({ "userid" : "123" });
對於有同樣的問題,我會在這裏重新發布在github上克雷格的回答人:
IQueryable alldata = hr.GetCollection"EventsReceiver").AsQueryable().Where(q => q.UserId == "123");
類似於:
var queryObject = ((IMongoQueryable)alldata).GetQueryObject();
這應該會讓您回到用於生成查詢的對象。
從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;
}
}
是不是這樣的呢? http://stackoverflow.com/questions/10261156/translate-queryablet-back-to-imongoquery?lq=1 –
檢查http://stackoverflow.com/questions/10261156/translate-queryablet-back-to-imongoquery?lq=1 –