Добавьте интервал времени в наблюдаемую коллекцию, используя linq - PullRequest
0 голосов
/ 25 февраля 2019

Я учу Linq, конвертируя запросы sql в linq.У меня есть таблица, которая имеет временные интервалы.Я хочу добавить временные интервалы

Входные данные:

Total Time

00:00:14 
00:00:55 
00:00:40

Выходные данные:

Total TIme Taken

00:01:49

SQL-запрос, который я использовал для преобразования вышеуказанного ввода в вывод

     SELECT count(*) as total_claimCount, 
     CONVERT(VARCHAR(10),SUM(DATEDIFF(second, '0:00:00', [Total Time])) /3600) + ':' 
     + RIGHT('00'+CONVERT(VARCHAR(2),(SUM(DATEDIFF(second, '0:00:00', [Total Time])) 
     %3600)/60),2)  + ':' +  RIGHT('00'+CONVERT(VARCHAR(2),SUM(DATEDIFF(second, 
    '0:00:00', [Total Time]))
     %60),2) AS Total_time_taken  FROM dbo.[opcod Audit Information] 
     where [End Time] is not null 

Теперь я хочу преобразовать указанный выше запрос в linq.Я сохранил данные таблицы в наблюдаемой коллекции под названием ModelclassTable.

Спасибо.

Редактировать: Данные таблицы

Тип данных всех столбцов там - varchar.

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Полагаю, этого должно быть достаточно.

Дано имя таблицы Таблица , Имя столбца TotalTime :

TimeSpan ts = new TimeSpan(Table.Select(x => TimeSpan.Parse(x.TotalTime).Ticks).Sum());

ts объект будетсодержат сумму значений.

Хотя, как отмечали многие другие люди, долгосрочное разрешение определенно не хранит значения Time как varchar.

0 голосов
/ 25 февраля 2019

Может быть, не очень разумно хранить информацию о дате / времени как varchar.Поэтому вам следует подумать об использовании типа столбца datetime.Кроме того, вам, возможно, следует использовать OR OR (например, EntityFramework) для взаимодействия с вашей базой данных, чтобы вам не пришлось беспокоиться о деталях системы безопасности SQL и т. Д.

Тем не менее, приведен списокпары строк, представляющие время начала и даты события:

public class EventData
{
    public string Start { get; set; }
    public string End { get; set; }

    public TimeSpan CalculateDuration()
    {
        if (String.IsNullOrEmpty(Start)
           || String.IsNullOrEmpty(End))
        {
            // What should happen, if start or end is not set?
        }

        // What should happen, if parsing fails?
        var start = DateTime.Parse(Start);
        var end = DateTime.Parse(End);

        // What should happen, if start is later then end??
        return end - start;
    }

    public override string ToString()
    {
        return $"{Start} - {End} => {CalculateDuration()}";
    }
}

private static readonly Random random = new Random();

private static EventData CreateSample()
{
    var now = DateTime.UtcNow;
    var start = now.AddSeconds(random.Next(1000));
    var end = start.AddSeconds(random.Next(1000));

    return new EventData
    {
        Start = start.ToString(),
        End = end.ToString()
    };
}

С помощью этих помощников теперь мы можем довольно легко вычислить суммы:

private static void Main(string[] args)
{
    var someEvents = Enumerable
        .Range(1, 10)
        .Select(_ => CreateSample())
        .ToList();

    foreach (var item in someEvents)
    {
        Console.WriteLine(item);
    }

    // Here we calculate the sum, by using .Aggregate()
    var all = someEvents.Aggregate(TimeSpan.Zero, (sum, item) => sum + item.CalculateDuration());
    Console.WriteLine(all);

    Console.WriteLine("Finished");
    Console.ReadKey();
}

Последнее, но не менее важное: этот кодпример действительно только пример.Таким образом, неправильно хранить и использовать значения (например, хранить даты в виде строки, вычислять продолжительность каждый раз, а не только один раз, без проверки аргументов, без обработки исключений и т. Д.).Поэтому, пожалуйста, продолжайте учиться и попытайтесь выяснить, что же не так в вашем коде и в моем примере.Надеюсь, через несколько месяцев вы посмотрите на этот код и будете думать так же.Попробуйте выяснить, как использовать что-то вроде EF или Dapper, и на последнем шаге вы можете начать думать о LINQ.

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