[英]Query with TAKE and check if it is null
我正在嘗試從Cosmos數據庫獲取信息,並且我想獲取一定數量的行或所有行。 例如,用戶可以鍵入100,他將僅獲得100行,如果不鍵入任何內容,則將獲得所有行。
在我使用.Take()獲得信息之前,例如:.Take(amount),但是如果amount為null,我將失敗。
帶有:
.Take(amount)
我想要這樣的東西:
.TakeIf(amount != null, amount);
我知道上面的行是錯誤的,但這就是這個主意。
以下幾行是完整的查詢。
var resultDTO = this.client.CreateDocumentQuery<DTO>(
UriFactory.CreateDocumentCollectionUri(idDatabase, idCollection), queryOptions)
.WhereIf(sourceId != null, x => x.sourceId == sourceId)
.Take(amount)
.AsEnumerable()
.ToList();
如何檢查金額是否為空?
感謝僅配置表達式,這一點更加深入。 默認情況下,CosmosDB僅返回分頁結果。 如果使用同步的AsEnumerable().ToList()
方法,您的代碼將以同步方式遍歷所有頁面。 這將導致糟糕的性能。 您想做的就是迭代並收集。 可悲的是,沒有花哨的方法可以解決這個問題。
遺憾的是,您無法將所有必需的代碼封裝在TakeIf
調用中,因為在查詢過程中還有更多的事情要做。
這是一個代碼示例。
var amount = 100;
var queryOptions = new RequestOptions {
MaxItemCount = 100
};
var queryable = this.client.CreateDocumentQuery<DTO>(
UriFactory.CreateDocumentCollectionUri(idDatabase, idCollection), queryOptions)
.WhereIf(sourceId != null, x => x.sourceId == sourceId);
if(amount != null && amount > 0){
queryable.Take(amount);
}
var documentQuery = queryable.AsDocumentQuery();
var results = new List<DTO>();
while (query.HasMoreResults)
{
if (amount != null && amount > 0 && results.Count == amount)
break;
var items = await query.ExecuteNextAsync<DTO>(cancellationToken);
foreach (var item in items)
{
results.Add(item);
if (amount != null && amount > 0 && results.Count == amount)
break;
}
}
return results;
在此示例中,我假設您只想在金額不為null且大於0時添加Take
調用。如果不是這種情況,請刪除> 0
支票。
有關此示例的更詳細示例,請在此處查看Cosmonaut的源代碼 。
我建議:
var bob = this.client.CreateDocumentQuery<DTO>( UriFactory.CreateDocumentCollectionUri(idDatabase, idCollection), queryOptions)
.WhereIf(SourceId != null, x => x.SourceId == SourceId);
var resultDTO = Amount == null ? bob.ToList() : bob.Take(Amount.Value).ToList();
如果Amount
不為null
則將僅應用Take
。
如果這不起作用,請嘗試在.AsEnumerable()
之前使用.ToList()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.