簡體   English   中英

如何使用 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"
}

當我在數據資源管理器上運行以下查詢時,我得到了我想要的(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)));
}

我通過使用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 ;
}

請查看以下LINQ 到 SQL 的翻譯文檔,它將幫助您構建正確的表達式。 一個例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM