如何使用 LINQ 编写带有 'in' 关键字的 Cosmos DB 查询?
How to write the Cosmos DB query with a 'in' keyword using LINQ?
我的 azure cosmos db 数据库中有这个示例文档。
{
"partitionKey": "SonicTag",
"label": "SonicTag",
"name": "Kasi Tournaments",
"slug": "kasi-tournaments",
"a2AQuestionsCount": 0,
"iconUrl": null,
"id": "1af53736-c492-40bf-8ef7-dba2d17f6c17"
}
当我 运行 在 Data Explorer 上执行以下查询时,我得到了我想要的结果(3 个具有指定 ID 的文档)。
SELECT * FROM c where c.id in
("dc4201ff-35b8-4eda-b0a6-f9bc2bb93926",
"3389f2f2-33f3-4b08-8d32-4602071eae30",
"1af53736-c492-40bf-8ef7-dba2d17f6c17")
and c.partitionKey = "SonicTag"
举个例子,在我的一个查询中,我正在寻找所有标签,我可以使用以下代码。
var feedIterator = Container.GetItemLinqQueryable<SonicTag>(true)
.Where(c => c.PartitionKey == nameof(SonicTag)
&& c.Label == nameof(SonicTag)).ToFeedIterator();
但我不知道如何编写我的 LINQ 来获取 al
请注意,在我必须构建此 LINQ 的方法中,我收到了一个 ID 列表,我必须获取所有具有这些 ID 的标签。参数保证最多只包含5个ID。
与此同时,我使用了一个明显不好的解决方法
var tags = new List<SonicTags>();
foreach (var id in IDs)
{
tags.Add( Helper.ConvertStreamToObject( await Container.ReadItemStreamAsync(id, partitionKey)));
}
请查看以下LINQ to SQL translation文档,这将帮助您构建正确的表达式。一个例子:
Where 运算符,示例 #2
LINQ lambda 表达式
input.Where(
family => family.parents[0].familyName == "Wakefield" &&
family.children[0].grade < 3);
SQL
SELECT *
FROM Families f
WHERE f.parents[0].familyName = "Wakefield"
AND f.children[0].grade < 3
我使用List<T>
的Contains
方法找到了解决办法。下面是我的方法。
public async Task<List<SonicTag>> GetTagsAsync(List<string> ids)
{
var feedIterator =
Container.GetItemLinqQueryable<SonicTag>()
.Where(x=> ids.Contains(x.Id)).ToFeedIterator();
var tags = new List<SonicTag>();
while (feedIterator.HasMoreResults)
{
var res = await feedIterator.ReadNextAsync();
tags.AddRange(res.ToList());
}
return tags ;
}
我的 azure cosmos db 数据库中有这个示例文档。
{
"partitionKey": "SonicTag",
"label": "SonicTag",
"name": "Kasi Tournaments",
"slug": "kasi-tournaments",
"a2AQuestionsCount": 0,
"iconUrl": null,
"id": "1af53736-c492-40bf-8ef7-dba2d17f6c17"
}
当我 运行 在 Data Explorer 上执行以下查询时,我得到了我想要的结果(3 个具有指定 ID 的文档)。
SELECT * FROM c where c.id in
("dc4201ff-35b8-4eda-b0a6-f9bc2bb93926",
"3389f2f2-33f3-4b08-8d32-4602071eae30",
"1af53736-c492-40bf-8ef7-dba2d17f6c17")
and c.partitionKey = "SonicTag"
举个例子,在我的一个查询中,我正在寻找所有标签,我可以使用以下代码。
var feedIterator = Container.GetItemLinqQueryable<SonicTag>(true)
.Where(c => c.PartitionKey == nameof(SonicTag)
&& c.Label == nameof(SonicTag)).ToFeedIterator();
但我不知道如何编写我的 LINQ 来获取 al
请注意,在我必须构建此 LINQ 的方法中,我收到了一个 ID 列表,我必须获取所有具有这些 ID 的标签。参数保证最多只包含5个ID。
与此同时,我使用了一个明显不好的解决方法
var tags = new List<SonicTags>();
foreach (var id in IDs)
{
tags.Add( Helper.ConvertStreamToObject( await Container.ReadItemStreamAsync(id, partitionKey)));
}
请查看以下LINQ to SQL translation文档,这将帮助您构建正确的表达式。一个例子:
Where 运算符,示例 #2
LINQ lambda 表达式
input.Where(
family => family.parents[0].familyName == "Wakefield" &&
family.children[0].grade < 3);
SQL
SELECT *
FROM Families f
WHERE f.parents[0].familyName = "Wakefield"
AND f.children[0].grade < 3
我使用List<T>
的Contains
方法找到了解决办法。下面是我的方法。
public async Task<List<SonicTag>> GetTagsAsync(List<string> ids)
{
var feedIterator =
Container.GetItemLinqQueryable<SonicTag>()
.Where(x=> ids.Contains(x.Id)).ToFeedIterator();
var tags = new List<SonicTag>();
while (feedIterator.HasMoreResults)
{
var res = await feedIterator.ReadNextAsync();
tags.AddRange(res.ToList());
}
return tags ;
}