1 回答
TA貢獻1852條經(jīng)驗 獲得超1個贊
所以在這種情況下,我確實認為你想要?IQueryable而不是IEnumerable.?最容易記住的方法是將IEnumerable所有數(shù)據(jù)加載到內(nèi)存中,然后運行其余的 LINQ 查詢,同時IQueryable嘗試在源上運行過濾器(如果它可以將結(jié)果數(shù)據(jù)加載到內(nèi)存中)。您確實需要使用支持IQueryableLINQ to SQL 或 Entity Framework 的 ORM。對于 CosmosDB,SDK 構(gòu)建在 LINQ to SQL 之上。
通過使用你將所有IEnumerable數(shù)據(jù)從 Cosmos加載到內(nèi)存中,然后應(yīng)用你的過濾器和分頁。當(dāng)您只有幾條記錄時這很好,但是隨著數(shù)據(jù)集的增長,您可能可以想象這會如何成為一個主要問題。通常,您希望在數(shù)據(jù)庫中做盡可能多的工作,并且只返回最少數(shù)量的結(jié)果。這將遠遠超過使用反射構(gòu)建謂詞的任何性能考慮因素。
的最好的部分之一IQueryable是它繼承自IEnumerable,因此任何與之一起工作的東西都IEnumerable將與IQueryable.?您需要做的就是擺脫您的AsEnumerable().
重要的是要注意,并非所有 LINQ 運算符都自動支持,一旦系統(tǒng)遇到無法翻譯的運算符,它就會執(zhí)行目前已有的操作,并在內(nèi)存中完成其余操作。文檔中有CosmosDB 的可用運算符列表。
對于您的查詢,最重要的是,雖然您的Where()條款得到支持,Skip()但Take()目前不支持。這意味著每次執(zhí)行此方法時,所有結(jié)果都將從 CosmosDB 返回,然后對分頁進行評估。
有幾種方法可以在 SDK 中處理分頁。當(dāng)前支持的方式是將MaxItemCountinside your設(shè)置FeedOptions為您的頁面大小。Skip()當(dāng)前系統(tǒng)使用延續(xù)令牌代替函數(shù)。為了訪問令牌,您可以使用AsDocumentQuery().?由于您必須逐頁瀏覽到下一頁,因此緩存令牌可能非常有幫助——跳來跳去很困難。
第二種選擇是使用 .Net SDK v3。它目前處于預(yù)覽階段,但可在 Nuget 上使用。幾個月前啟用了 skip/take。在這種情況下,在您調(diào)用之前的所有內(nèi)容ToList()都應(yīng)轉(zhuǎn)換為 SQL 并在 CosmosDB 中進行評估。
- 1 回答
- 0 關(guān)注
- 156 瀏覽
添加回答
舉報
