Member 14637786 Ответов: 0

Фильтрация Cosmosdb по универсальному типу (объекту)


Привет,

У меня есть довольно уникальная ситуация, чтобы справиться (я думаю). Итак, сценарий таков, что у меня есть CosmosDb и модель данных, выглядящая следующим образом:
{
	"deviceId": "exampleId",
	"properties": [
		{
			"name": "temperature",
			"value": 20
		},
		{
			"name": "humidity",
			"value": 10
		}
	]
}

в то время как класс C# выглядит следующим образом:
public class 
{
    public string DeviceId { get; set; }
    public IEnumerable<PropertyObject> Properties { get; set; }
}

 public class PropertyObject
 {
      public string Name { get; set; }
      public object Value { get; set; }
 }

Таким образом, проблема заключается в том, что мне нужно, чтобы это было отфильтровано по PropertyObject и его значению.

Не было бы никаких проблем, если бы это была жестко типизированная модель, но в этом случае значение-это объект и может быть очень много вещей. Иногда это может быть строка, десятичное или целое число.

Что я уже пробовал:

И очевидно, что это не работает:

properties.Where( x => x.Name == "temperature" && x.Value > 20);

Поскольку ценность-это объект. Это сработает, если я добавлю кастинг:
properties.Where( x => x.Name == "temperature" && (int)x.Value > 20);


Но я не могу жестко закодировать его,так как каждый объект propertyobject может иметь разный тип значения в свойстве Value (int,decimal,datetime, string и т. д.)

Есть ли у вас какие-либо идеи, как это можно сделать для фильтрации CosmosDb в C# с помощью последней версии Azure Cosmos SDK?
У меня есть свободная рука, чтобы изменить код C#, и я могу получить доступ к информации о типе конкретного свойства (из конфигурационного файла).
Может быть, построитель выражений для LINQ был бы здесь хорошим способом?
Я также думаю о том, как бы это работало, если бы модель была динамическим типом, возможно, это позволило бы что-то сделать. Я не знаю, я не настолько опытен в работе с nosql db, как Cosmos.

0 Ответов