1 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個贊
所以在這種情況下,我確實(shí)認(rèn)為你想要?IQueryable
而不是IEnumerable
.?最容易記住的方法是將IEnumerable
所有數(shù)據(jù)加載到內(nèi)存中,然后運(yùn)行其余的 LINQ 查詢,同時IQueryable
嘗試在源上運(yùn)行過濾器(如果它可以將結(jié)果數(shù)據(jù)加載到內(nèi)存中)。您確實(shí)需要使用支持IQueryable
LINQ 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é)果。這將遠(yuǎn)遠(yuǎn)超過使用反射構(gòu)建謂詞的任何性能考慮因素。
的最好的部分之一IQueryable
是它繼承自IEnumerable
,因此任何與之一起工作的東西都IEnumerable
將與IQueryable
.?您需要做的就是擺脫您的AsEnumerable()
.
重要的是要注意,并非所有 LINQ 運(yùn)算符都自動支持,一旦系統(tǒng)遇到無法翻譯的運(yùn)算符,它就會執(zhí)行目前已有的操作,并在內(nèi)存中完成其余操作。文檔中有CosmosDB 的可用運(yùn)算符列表。
對于您的查詢,最重要的是,雖然您的Where()
條款得到支持,Skip()
但Take()
目前不支持。這意味著每次執(zhí)行此方法時,所有結(jié)果都將從 CosmosDB 返回,然后對分頁進(jìn)行評估。
有幾種方法可以在 SDK 中處理分頁。當(dāng)前支持的方式是將MaxItemCount
inside 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 中進(jìn)行評估。
- 1 回答
- 0 關(guān)注
- 138 瀏覽
添加回答
舉報