Чтение таблицы хранения массива в c# - PullRequest
1 голос
/ 12 февраля 2020

В таблице хранения таблицы у меня есть поля массива.

Как я могу прочитать это в c#?

Я пытаюсь отобразить поле как строку:

public string @params { get; set; }

но я всегда получаю «Массив» в качестве его содержимого.

Как предложил Кевин, я изменил модель следующим образом:

    public string @params { get; set; }

    [IgnoreProperty]
    public ObjParams[] param
    {
        get
        {
            if (@params != null)
                return JsonConvert.DeserializeObject<ObjParams[]>(@params);
            else
                return null;
        }
        set
        {
            @params = JsonConvert.SerializeObject(value);
        }
    }

, но десериализация не удалась, потому что @params alwas равен 'Array'.

Запрос потоковой аналитики, используемый для заполнения параметров, следующий:

SELECT
    IoTHub.ConnectionDeviceId as PartitionKey,
    RowKey =  TRY_CAST( TRY_CAST( DATEDIFF( SECOND, DATETIMEFROMPARTS(1970, 1, 1, 0, 0, 0, 0), i.mts) AS NVARCHAR(MAX) ) + '00' as FLOAT) , -- unix epoch timestamp & Line & TimeSlot
    mts = TRY_CAST(i.mts AS DATETIME),
    ver = i.ver,
    eventId = i.eventId,
    tags = i.tags,
    params = i.params,
    CASE WHEN YEAR(TRY_CAST(i.StartTS as DATETIME)) = 1970  THEN NULL ELSE TRY_CAST(i.StartTS AS DATETIME) END as StartTS,
    CASE WHEN YEAR(TRY_CAST(i.EndTS as DATETIME)) = 1970  THEN NULL ELSE TRY_CAST(i.EndTS AS DATETIME) END as EndTS,
    CASE WHEN YEAR(TRY_CAST(i.StartTS as DATETIME)) > 1970  and YEAR(TRY_CAST(i.EndTS as DATETIME)) > 1970 
        THEN DATEDIFF(second, i.StartTS, i.EndTS) ELSE 0 END as DurationTS,
    no = i.no,
    severity = i.severity,
    L = i.L

    --i.*        
FROM
    IoTHubInput00 AS i 
    PARTITION BY PartitionId -- partitionby per performance e scalabilità
    TIMESTAMP BY TRY_CAST(i.mts AS DATETIME)
WHERE  
    i.type ='event' 

, а в источнике i.params - JSON.

JSON в источнике похож на следующий пример:

 "params": [
    {
        "tipo": "ssid",
        "value": 0
    },
    {
        "tipo": "rssi",
        "value": 0
    }
 ],

ОБНОВЛЕНИЕ

Я изменяю модель следующим образом:

public class EventTS : TableEntity
{
    public EventTS() { }

    public EventTS(string partitionKey, string rowKey)
    {
        this.PartitionKey = partitionKey;
        this.RowKey = rowKey;
    }

    public string uid {
        get
        {
            return this.RowKey;
        } 
    }

    public long DurationTS { get; set; }
    public DateTime EndTS { get; set; }
    public string L { get; set; }
    public long eventId { get; set; }
    public DateTime mts { get; set; }
    public long no { get; set; }

    [EntityPropertyConverter]
    public List<ObjParams> @params { get; set; }

    public override IDictionary<string, EntityProperty> WriteEntity(OperationContext operationContext)
    {
        var results = base.WriteEntity(operationContext);
        EntityPropertyConvert.Serialize(this, results);
        return results;
    }

    public override void ReadEntity(IDictionary<string, EntityProperty> properties, OperationContext operationContext)
    {
        base.ReadEntity(properties, operationContext);
        EntityPropertyConvert.DeSerialize(this, properties);
    }

    public long severity { get; set; }
    public string tags { get; set; }
    public string ver { get; set; }

    public string decodifica_evento { get; set; }
    public EventsTypeDescription descrizione_evento { get; set; }

    public bool BLedAcceso { get; set; }
    public long BLedSeverity { get; set; }
    public string tsUTCOffset { get; set; }
    public string startsUTCOffset { get; set; }
    public string endtsUTCOffset { get; set; }
    public string IoTHubError { get; set; }
}

но когда вызывается ReadEntity, словарь свойств не содержит параметров. Почему?

Спасибо.

1 Ответ

0 голосов
/ 12 февраля 2020

По умолчанию драйвер C# не работает с массивами или сложными типами, это обходной путь для создания свойства, которое выполняет сериализацию для вашего свойства массива

public class MyEntity : TableEntity
{
    public string MyPropery { get; set; }

    [IgnoreProperty]
    public string[] MyProperyArray
    {
        get
        {
            return JsonConvert.DeserializeObject<string[]>(MyPropery);
        }
        set
        {
            MyPropery = JsonConvert.SerializeObject(value);
        }
    }
}
...