[英]MongoDb driver c# query optimization
我在mongo db doc中讀到,我也可以使用LINQ,但我對此一無所知。
例如,如果我寫:
var result = collection.Find(filter);
和
var result = collection.AsQueryable()
.Where(x => x.Foo == 114)
什么是更好的?
LINQ篩選器基於整個集合嗎? 在獲得整個收藏之前,它會進行過濾嗎? 還是在過濾器之前,它給了我已經過濾的集合?
兩者幾乎一樣。
LINQ API是Collection API的包裝。
通過簡要研究mongo-csharp-driver的源代碼,我可以看到LINQ版本調用了Collection.FindAs(...)或Collection.Distinct(...) 。 它基於LINQ表達式構造在query
參數中傳遞的IMongoQuery
。 為此,它使用查詢構建器API( Query類),例如Query.EQ。
什么是更好的?
這取決於。
class
)。 在這種情況下,使用LINQ會很麻煩,原始的Collection API將是一個更好的選擇。 LINQ篩選器基於整個集合嗎? 在獲得整個收藏之前,它會進行過濾嗎? 還是在過濾器之前,它給了我已經過濾的集合?
由於LINQ API實現了IQueryable
而不是IEnumeable
,因此實際上並未調用所有可枚舉的方法(例如Where
或OrderBy
),而是在編譯過程中將其轉換為生成表達式樹的代碼。 在運行時,將構建表達式樹並將其傳遞給基礎查詢提供程序(在這種情況下,由MongoDB驅動程序實現)。 查詢提供程序將表達式樹轉換為常規的MongoDB查詢,並通過常規的MongoDB API執行它們。
有關更多詳細信息,請參見如何:使用表達式樹構建動態查詢 。
因此,查詢實際上是在數據庫中執行的,並且只有已處理(過濾,排序或計划)的結果返回給應用程序。
但是,使用LINQ API會帶來一些性能開銷,因為LINQ API除了運行查詢之外,還:
在許多情況下,這種開銷可以忽略不計,但這取決於您的要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.