簡體   English   中英

用TAKE查詢並檢查是否為空

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM