Как написать запрос к базе данных Cosmos с ключевым словом in, используя LINQ? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть этот образец документа в моей базе данных azure cosmos db.

{
    "partitionKey": "SonicTag",
    "label": "SonicTag",
    "name": "Kasi Tournaments",
    "slug": "kasi-tournaments",
    "a2AQuestionsCount": 0,
    "iconUrl": null,
    "id": "1af53736-c492-40bf-8ef7-dba2d17f6c17"
}

Когда я запускаю следующий запрос в проводнике данных, я получаю именно то, что хочу (3 документа с указанным Идентификаторы).

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, я получаю список идентификаторов, и я должен получить все теги, которые имеют эти идентификаторы. Параметру гарантируется, что он будет содержать не более 5 идентификаторов.

Тем временем я использовал то, что явно является плохим обходным путем

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

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Я нашел решение, используя Contains метод List<T>. Ниже мой метод.

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 ;
}
0 голосов
/ 02 мая 2020

Пожалуйста, посмотрите на следующий LINQ to SQL перевод документ, который поможет вам построить правильное выражение. Пример:

Где оператор, пример # 2 "

Лямбда-выражение LINQ

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...