public void CrunchMetadata(DataSet metadata) { DataSet dataSource = new DataSet(); DataTable activeMeasurements = new DataTable("ActiveMeasurements"); activeMeasurements.Columns.Add("SourceNodeID", typeof(Guid)); activeMeasurements.Columns.Add("ID", typeof(string)); activeMeasurements.Columns.Add("SignalID", typeof(Guid)); activeMeasurements.Columns.Add("PointTag", typeof(string)); activeMeasurements.Columns.Add("AlternateTag", typeof(string)); activeMeasurements.Columns.Add("SignalReference", typeof(string)); activeMeasurements.Columns.Add("Internal", typeof(bool)); activeMeasurements.Columns.Add("Subscribed", typeof(bool)); activeMeasurements.Columns.Add("Device", typeof(string)); activeMeasurements.Columns.Add("DeviceID", typeof(int)); activeMeasurements.Columns.Add("FramesPerSecond", typeof(int)); activeMeasurements.Columns.Add("Protocol", typeof(string)); activeMeasurements.Columns.Add("ProtocolType", typeof(string)); activeMeasurements.Columns.Add("SignalType", typeof(string)); activeMeasurements.Columns.Add("EngineeringUnits", typeof(string)); activeMeasurements.Columns.Add("PhasorID", typeof(int)); activeMeasurements.Columns.Add("PhasorType", typeof(string)); activeMeasurements.Columns.Add("Phase", typeof(string)); activeMeasurements.Columns.Add("Adder", typeof(double)); activeMeasurements.Columns.Add("Multiplier", typeof(double)); activeMeasurements.Columns.Add("Company", typeof(string)); activeMeasurements.Columns.Add("Longitude", typeof(decimal)); activeMeasurements.Columns.Add("Latitude", typeof(decimal)); activeMeasurements.Columns.Add("Description", typeof(string)); activeMeasurements.Columns.Add("UpdatedOn", typeof(DateTime)); IEnumerable <DataRow> deviceDetail = metadata.Tables["DeviceDetail"].Rows.Cast <DataRow>(); IEnumerable <DataRow> measurementDetail = metadata.Tables["MeasurementDetail"].Rows.Cast <DataRow>(); IEnumerable <DataRow> phasorDetail = metadata.Tables["PhasorDetail"].Rows.Cast <DataRow>(); MeasurementKey key; measurementDetail .Where(measurement => MeasurementKey.TryCreateOrUpdate(measurement.ConvertField <Guid>("SignalID"), measurement.ConvertField <string>("ID"), out key)) .GroupJoin(deviceDetail, measurement => measurement.ConvertField <string>("DeviceAcronym"), device => device.ConvertField <string>("Acronym"), (measurement, devices) => new { Measurement = measurement, Device = devices.FirstOrDefault() } ) .GroupJoin(phasorDetail, obj => new { DeviceAcronym = obj.Device?.ConvertField <string>("Acronym"), PhasorSourceIndex = obj.Measurement.ConvertField <int>("PhasorSourceIndex") }, phasor => new { DeviceAcronym = phasor.ConvertField <string>("DeviceAcronym"), PhasorSourceIndex = phasor.ConvertField <int>("SourceIndex") }, (obj, phasors) => new { Device = obj.Device, Measurement = obj.Measurement, Phasor = phasors.FirstOrDefault() } ) .ToList() .ForEach(obj => { activeMeasurements.Rows.Add( obj.Device?.ConvertField <Guid>("NodeID") ?? (object)DBNull.Value, obj.Measurement.ConvertField <string>("ID"), obj.Measurement.ConvertField <Guid>("SignalID"), obj.Measurement.ConvertField <string>("PointTag"), DBNull.Value, obj.Measurement.ConvertField <string>("SignalReference"), obj.Measurement.ConvertField <bool>("Internal"), true, obj.Device?.ConvertField <string>("Acronym") ?? (object)DBNull.Value, DBNull.Value, obj.Device?.ConvertField <int?>("FramesPerSecond") ?? (object)DBNull.Value, DBNull.Value, DBNull.Value, obj.Measurement.ConvertField <string>("SignalAcronym"), DBNull.Value, DBNull.Value, obj.Phasor?.ConvertField <string>("Type") ?? (object)DBNull.Value, obj.Phasor?.ConvertField <string>("Phase") ?? (object)DBNull.Value, 0, 1, obj.Device?.ConvertField <string>("CompanyAcronym") ?? (object)DBNull.Value, obj.Device?.ConvertField <decimal?>("Longitude") ?? (object)DBNull.Value, obj.Device?.ConvertField <decimal?>("Latitude") ?? (object)DBNull.Value, obj.Measurement.ConvertField <string>("Description"), obj.Measurement.ConvertField <DateTime>("UpdatedOn") ); }); dataSource.Tables.Add(activeMeasurements); m_dataSource = dataSource; }