我正在尝试从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();
如何检查金额是否为空?
答案 0 :(得分:1)
这是更深层次的感谢,只是配置表达式。默认情况下,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
检查。 / p>
有关此支票Cosmonaut's source code here的详细示例。
答案 1 :(得分:0)
我建议:
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();
仅当Take
不是Amount
时,这将应用null
。
如果这样不起作用,请尝试在.AsEnumerable()
之前使用.ToList()
。