c # linq запрос извлекать повторяющиеся типы данных - PullRequest
0 голосов
/ 07 марта 2019

У меня есть список необработанных данных, где всегда доступно 8 значений данных для одной отметки времени Date_Time.Я хотел бы использовать linq для сортировки значений столбца Data_Value по Data_Type в одну строку для каждого Date_Time.

Таблица необработанных данных

У меня есть следующий класс, и я быхотел бы вернуть его как список этого класса.

public class MeasurementData
{
public MeasurementData();

public int Test_ID { get; set; }
public int Channel { get; set; }
public string Date_Time { get; set; }
public double Current { get; set; }
public double Voltage { get; set; }
public double Charge_Capacity { get; set; }
public double Discharge_Capacity { get; set; }
}

Вот сокращенная форма кода, где я просто пытаюсь извлечь четыре значения.

public static List<DataStructure.MeasurementData>     RawResult(List<DataStructure.MeasurementRawTableSQL> rawData, int _Test_ID)
{
if (rawData != null)
{
    var result = rawData.GroupBy(x => x.Date_Time)
         .Select(gr =>
         {
             var _Date_Time = TicksToDate(gr.FirstOrDefault().Date_Time);
             var _Channel = gr.FirstOrDefault().Channel;
             var _Voltage = gr.Where(x => x.Data_Type == 21).FirstOrDefault().Data_Value;
             var _Current = gr.Where(x => x.Data_Type == 22).FirstOrDefault().Data_Value;
             var _Charge_Capacity = gr.Where(x => x.Data_Type == 23).FirstOrDefault().Data_Value;
             var _Discharge_Capacity = gr.Where(x => x.Data_Type == 24).FirstOrDefault().Data_Value;

             return new DataStructure.MeasurementData
             {
                 Test_ID = _Test_ID,
                 Channel = _Channel,
                 Date_Time = _Date_Time,
                 Current = _Current,
                 Voltage = _Voltage,
                 Charge_Capacity = _Charge_Capacity,
                 Discharge_Capacity = _Discharge_Capacity
             };
         }
         ).ToList();

    return result;
}
else return null;
}

Это частичноработает, для случаев 21 и 22 это дает мне правильные значения, в то время как я получаю ошибку «Ссылка на объект не установлена ​​на экземпляр объекта» для случаев 23 и 24. С другой стороны, база данных имеет эти строки для каждогоdatapoint и никогда не является нулевымЕсли я выберу только First () вместо FirstOrDefault (), я получу «последовательность не содержит элементов».

Я действительно застрял прямо сейчас и очень ценю вашу помощь.

1 Ответ

0 голосов
/ 11 марта 2019

Ниже представлен самый чистый способ решения проблемы. Я не могу объяснить, почему вы не получаете Data_Type для каждого значения времени, но код ниже должен обойти исключения. Я использовал десятичную? как тип. Исключение возникает, когда WHERE возвращает значение NULL, вы не можете получить свойство Data_Value. Таким образом, вы должны проверить нулевой код, подобный приведенному ниже:

    class Program
    {
        static void Main(string[] args)
        {
        }
        //public DataStructures DataStructure = new DataStructures();

        public static List<DataStructure.MeasurementData> RawResult(List<DataStructure.MeasurementRawTableSQL> rawData, int _Test_ID)
        {
            if (rawData != null)
            {
                double? _Voltage = null;
                double? _Current = null;
                double? _Charge_Capacity = null;
                double? _Discharge_Capacity = null;

                var result = rawData.GroupBy(x => x.Date_Time)
                     .Select(gr =>
                     {
                         var _Date_Time = gr.Key;
                         var _Channel = gr.FirstOrDefault().Channel;
                         var _Voltage_Row = gr.Where(x => x.Data_Type == 21).FirstOrDefault();
                         if(_Voltage_Row != null) _Voltage = _Voltage_Row.Data_Value;
                         var _Current_Row = gr.Where(x => x.Data_Type == 22).FirstOrDefault();
                         if(_Current_Row != null) _Current = _Current_Row.Data_Value;
                         var _Charge_Capacity_Row = gr.Where(x => x.Data_Type == 23).FirstOrDefault();
                         if (_Charge_Capacity_Row != null) _Charge_Capacity = _Charge_Capacity_Row.Data_Value; 
                         var _Discharge_Capacity_Row = gr.Where(x => x.Data_Type == 24).FirstOrDefault();
                         if (_Discharge_Capacity_Row != null) _Discharge_Capacity = _Discharge_Capacity_Row.Data_Value; 

                         return new DataStructure.MeasurementData
                         {
                             Test_ID = _Test_ID,
                             Channel = _Channel,
                             Date_Time = _Date_Time,
                             Current = _Current,
                             Voltage = _Voltage,
                             Charge_Capacity = _Charge_Capacity,
                             Discharge_Capacity = _Discharge_Capacity
                         };
                     }
                     ).ToList();

                return result;
            }
            else return null;
        }
    }
    public class DataStructure
    {

        public class MeasurementData
        {
            public int? Test_ID { get; set; }
            public int? Channel { get; set; }
            public DateTime Date_Time { get; set; }
            public double? Current { get; set; }
            public double? Voltage { get; set; }
            public double? Charge_Capacity { get; set; }
            public double? Discharge_Capacity { get; set; }
        }

        public class MeasurementRawTableSQL
        {
            public DateTime Date_Time { get; set; }
            public int Channel { get; set; }
            public int Data_Type { get; set; }
            public double Data_Value { get; set; }

        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...