有沒有辦法在Linq查詢上運行.explain()
或同等功能?我想知道MongoDB Linq是否有「解釋查詢」?
- 實際JSON查詢的文本
- 的
.explain()
輸出(索引使用等) - 這也將是不錯的查詢的執行時間
有沒有辦法在Linq查詢上運行.explain()
或同等功能?我想知道MongoDB Linq是否有「解釋查詢」?
.explain()
輸出(索引使用等)如果您有查詢包裝器,您可以輕鬆獲得Json;
var qLinq = Query<T>.Where(x => x.name=="jim");
Console.WriteLine(qLinq.ToJson());
對MongoCursor還有一個Explain()方法,所以你可以這樣做;
var exp = Collection.FindAs<T>(qLinq).Explain()
Console.WriteLine(exp.ToJson());
所以,如果你想要的時間,「millis」在那裏;
var msTaken = exp.First(x => x.Name == "millis").Value.AsInt32;
如果你有一個IQueryable
,嘗試類似這樣;
void Do(MongoCollection col, IQueryable iq)
{
// Json Mongo Query
var imq = (iq as MongoQueryable<Blob>).GetMongoQuery();
Console.WriteLine(imq.ToString());
// you could also just do;
// var cursor = col.FindAs(typeof(Blob), imq);
var cursor = MongoCursor.Create(typeof(Blob), col, imq, ReadPreference.Nearest);
var explainDoc = cursor.Explain();
Console.WriteLine(explainDoc);
}//Do()
如果你想在圖書館這個功能,我剛剛創建了一個GitHub的項目名爲
MongoDB的查詢幫手.NET
https://github.com/mikeckennedy/mongodb-query-helper-for-dotnet
它將:
檢查出來,如果你覺得有趣的貢獻。
是的,有。這表明一切.explain
不和有冗長的布爾(它包括花費的執行時間):
var database = new MongoClient().GetServer().GetDatabase("db");
var collection = database.GetCollection<Hamster>("Hamsters");
var explanation = collection.AsQueryable().Where(hamster => hamster.Name == "bar").Explain(true);
Console.WriteLine(explanation);
它並不雖然顯示查詢。下面是該擴展方法:
public static string GetMongoQuery<TItem>(this IQueryable<TItem> query)
{
var mongoQuery = query as MongoQueryable<TItem>;
return mongoQuery == null ? null : mongoQuery.GetMongoQuery().ToString();
}
用法:
var query = collection.AsQueryable().Where(hamster => hamster.Name == "bar").GetMongoQuery();
Console.WriteLine(query);
MongoDB中3 C#我用以下:
var users = Mongo.db.GetCollection<User>("Users");
var r = users(m => m._id == yourIdHere)
.Project(m => new { m._id, m.UserName, m.FirstName, m.LastName })
.Limit(1);
Console.WriteLine(users.ToString());
結果:
find({ "_id" : ObjectId("56030e87ca42192008ed0955") }, { "_id" : 1, "UserName" : 1, "FirstName" : 1, "LastName" : 1 }).limit(1)
感謝。我們大多數查詢來自'IQueryable'對象。也許更好的問題是如何將'IQueryable'變成'IMongoQuery'? – kelloti
這並不容易,但你可以做到 - 看到更新的答案。另一種方法是在Mongo Linq層上放置一個Repository,這樣你就可以直接使用Query <>對象,做你的日誌記錄然後返回IQueryable,而不是嘗試將IQueryable轉換爲Query <> – cirrus
感謝您的幫助。儘管您的解決方案實際上並未編譯。查看我的更新,瞭解實際爲我工作的內容(注意,我必須深入研究'Expression'以獲取where子句)。 – kelloti