运行 使用 Cosmos DB 并发查询 SQL API

Run queries concurrently using Cosmos DB SQL API

我 运行 遇到 Cosmos SDK 生成查询的问题,该查询包含太多字符


// A list with over 100k items
var carPositionIds = new List<CarPositionsIds>()

...

var iterator = CarContainer
.GetItemLinqQueryable<Car>(true)
.Where(x => carPositionIds.Contain(x.Id))
.ToFeedIterator();

错误:SQL 查询文本超出了 Azure CosmosDB 中 30720 个字符的最大限制

我理解这是因为 .Contains。 因此,与其进行一个大查询,我将 carPositionIds 列表拆分为更小的列表,并 运行 同时进行许多更小的查询

var ListOfIds = carPositionIds.Split(10000); // Returns a IEnumerable<IEnumerable<T>>, where each list has up to 10000 items


var conTasks = new List<Task<FeedResponse<Car>>>();

foreach(var ids in listOfIds)
{
    var iterator = CarContainer
      .GetItemLinqQueryable<Car>(true)
      .Where(x => ids.Contain(x.Id))
      .ToFeedIterator();

 while(iterator.HasMoreResults)
       {
         var i = iterator.ReadNextAsync();
         conTasks.Add(i);
       {
}

await Task.WhenAll(conTasks);
    
    var cars = new List<Cars>();
    foreach(var t in conTasks)
    {
        cars.AddRange(t.Result);
    }


每次我 运行 这样做时,我都会在汽车列表中获得不同数量的汽车。我怎样才能 运行 同时查询多个?

  • 谢谢你,很高兴你已经清除了issue

  • 在此发布答案,以便对其他社区成员有所帮助。

  • 解析步骤如下:

public async Task<List<Cars>> GetCarsByIds(int ids)
{
    var result = new List<Cars>();

    var iterator = CarContainer
        .GetItemLinqQueryable<Car>(true)
        .Where(x => ids.Contain(x.Id))
        .ToFeedIterator();   

    while(iterator.HasMoreResults) 
    {          
        var i = await iterator.ReadNextAsync();          
        result.AddRange(i);        
    }  

    return result;
}

//...

var conTasks = new List<Task<FeedResponse<Car>>>();  
foreach(var ids in listOfIds) {     
    conTasks.Add(GetCarsByIds(ids))
}

// Add results into array