用TAKE查询并检查是否为空

时间:2019-07-15 10:57:17

标签: c# linq azure-cosmosdb

我正在尝试从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();

如何检查金额是否为空?

2 个答案:

答案 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()