C# 如何使用LINQ编写带有“in”关键字的Cosmos DB查询?

C# 如何使用LINQ编写带有“in”关键字的Cosmos DB查询?,c#,linq-to-sql,azure-cosmosdb,azure-cosmosdb-sqlapi,C#,Linq To Sql,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我的azure cosmos数据库中有这个示例文档 { "partitionKey": "SonicTag", "label": "SonicTag", "name": "Kasi Tournaments", "slug": "kasi-tournaments", "a2AQuestionsCount": 0, "iconUrl": null, "id": "1af53736-c492-40bf-8ef7-dba2d17f6c17" }

我的azure cosmos数据库中有这个示例文档

{
    "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才能得到艾尔

请注意,在我必须构造这个LINQ的方法中,我收到一个ID列表,我必须得到所有具有这些ID的标记。该参数保证最多只包含5个ID

同时,我使用了一种明显不好的解决方法

var tags = new List<SonicTags>();
foreach (var id in IDs)
{
    tags.Add( Helper.ConvertStreamToObject( await Container.ReadItemStreamAsync(id, partitionKey)));
}

请看下面的文档,它将帮助您构造正确的表达式。例如:

其中,运算符,示例2

LINQ lambda表达式

input.Where(
    family => family.parents[0].familyName == "Wakefield" &&
    family.children[0].grade < 3);
SQL


我使用列表的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 ;
}

非常感谢迈克作为第一反应者。。。恕我直言,您的答案并没有回答我的问题,您的查询生成的SQL证明了这一点。在我发布这个问题之前,我一遍又一遍地浏览了那个文档,但找不到我需要的东西。我想传递一个ID字符串列表,然后查询数据库以获取所有具有这些ID的文档。我很高兴您找到了解决问题的方法,并发布了您的解决方案,因为这有助于其他面临类似情况的人。我的目标是浏览所有未回复的帖子并提供一些东西。我的回答应该是评论。谢谢你的反馈。
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 ;
}