В таблице хранения таблицы у меня есть поля массива.
Как я могу прочитать это в 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, словарь свойств не содержит параметров. Почему?
Спасибо.