Мы используем Azure Cosmos DB и используем пакет nuGet microsoft. azure .documentdb.core для отправки к нему запросов. Это хорошо работает для большинства наших запросов, но теперь у нас есть запрос, который нам трудно перевести.
Предположим, что этот простой тип объекта:
{ type: "abc",
flags: [
{ feature: "x", scope: "user", value: "on" },
{ feature: "y", scope: "global", value: "off" }
]
}
Теперь допустим, что мы хотим получить все эти объекты, соответствующие некоторой функции и области действия, но полностью игнорируя значение.
Это можно сделать с помощью следующего запроса:
SELECT * FROM MyCollection c WHERE /*other filters*/ and ARRAY_CONTAINS(c.flags, { feature: 'x', scope: 'user' }, true)
Когда я пытаюсь сопоставить это с C# Я получаю это:
public class Flag {
public string feature { get; set; }
public string scope { get; set; }
public string value { get; set; }
}
public class MyRecRepo {
public async ICollection<MyRecType> GetRecordsWithFlag(Flag: flag) {
var request = client
.CreateDocumentQuery(collection, feedoptions)
.Where(rec => /*other filters*/ && rec.flags.Contains(flagFilter));
return await request
.AsDocumentQuery()
.ExecuteNextAsync<MyRecTyp>();
}
}
//called like this:
var flagFilter = new Flag { feature = "x", scope = "user" };
var list = await repo.GetRecordsWithFlag(flagFilter);
PS: Я хочу использовать тот же код для получения любой комбинации фильтров флагов. Итак, отфильтруйте флаги, которые имеют только «feature: x», или записи, которые имеют функцию «y» и значение «on» ... Итак, я думаю, что мог бы создать один класс для каждой комбинации свойств, но похоже, что это много работы конечно, если реальный живой код действительно имеет больше свойств.
PS: Я знаю, что код примера не будет компилироваться, это псевдокод, чтобы сделать его немного более читаемым.