运行 使用 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
我 运行 遇到 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