/// <summary>
 /// Convert to monitored item
 /// </summary>
 /// <param name="publishedEvents"></param>
 /// <param name="displayName"></param>
 /// <returns></returns>
 public static MonitoredItemModel ToMonitoredItem(
     this PublishedDataSetEventsModel publishedEvents,
     string displayName = null)
 {
     if (publishedEvents?.SelectedFields == null)
     {
         return(null);
     }
     return(new MonitoredItemModel {
         Id = publishedEvents.Id,
         DisplayName = displayName,
         EventFilter = new EventFilterModel {
             SelectClauses = publishedEvents.SelectedFields?
                             .Select(s => s.Clone())
                             .ToList(),
             WhereClause = publishedEvents.Filter.Clone(),
         },
         AggregateFilter = null,
         DiscardNew = publishedEvents.DiscardNew,
         QueueSize = publishedEvents.QueueSize,
         TriggerId = publishedEvents.TriggerId,
         MonitoringMode = publishedEvents.MonitoringMode,
         StartNodeId = publishedEvents.EventNotifier,
         RelativePath = publishedEvents.BrowsePath,
         AttributeId = null,
         DataChangeFilter = null,
         IndexRange = null,
         SamplingInterval = null
     });
 }
 /// <summary>
 /// Clone
 /// </summary>
 /// <param name="model"></param>
 /// <returns></returns>
 public static PublishedDataSetEventsModel Clone(this PublishedDataSetEventsModel model)
 {
     if (model == null)
     {
         return(null);
     }
     return(new PublishedDataSetEventsModel {
         Id = model.Id,
         MonitoringMode = model.MonitoringMode,
         TriggerId = model.TriggerId,
         DiscardNew = model.DiscardNew,
         EventNotifier = model.EventNotifier,
         Filter = model.Filter.Clone(),
         QueueSize = model.QueueSize,
         BrowsePath = model.BrowsePath,
         SelectedFields = model.SelectedFields?
                          .Select(f => f.Clone())
                          .ToList()
     });
 }