Linq to sql, подведение итогов? - PullRequest
1 голос
/ 02 марта 2009

У меня есть поле времени в базе данных mssql 2008, которое я хочу сделать с эффектом:

Timespent = x.sum(x => x.AmountOfTime);

Где AmountOfTime - поле времени MSSQL. Кажется, что Sum работает только с десятичными числами. Как я могу добавить эти столбцы?

Ответы [ 4 ]

0 голосов
/ 13 августа 2009
public static class Extentions
{
    public static TimeSpan Sum<T>(this IEnumerable<T> items, Func<T, TimeSpan> selector)
    {
        var summ = TimeSpan.Zero;
        foreach(T item in items)
        {
            summ += selector(item);
        }
        return summ;
    }
}

var timespent = foo.Sum(f => f.finishdatetime - f.startdatetime);
0 голосов
/ 02 марта 2009

Возможно, вы захотите преобразовать периоды в интервалы - если необходимо, вычитая время начала из времени окончания. Обратите внимание, что тип TIME представляет момент, а не продолжительность. В стандартном SQL вы хотите, чтобы ИНТЕРВАЛ ЧАС ВТОРОЙ. Я не уверен, поддерживает ли это Microsoft - есть другие крупные СУБД, которые этого не делают. Если вы застряли с TIME, вы сможете вычесть TIME '00: 00: 00 'из значений и получить что-то работоспособное (это ИНТЕРВАЛ).

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

Для получения подробной информации, вы можете вручную bash на MSDN (или через Google), а я могу.

0 голосов
/ 16 мая 2009

Я решил это, используя следующий метод, учитывая, что у вас есть время начала и окончания на вашем столе:

public TimeSpan AmountOfTime(IQueryable<Something> iq)
{
    TimeSpan ts = TimeSpan.Zero;
    foreach (Something a in iq.ToList())
        ts += (a.finishdatetime - a.startdatetime);
    return ts
}

Затем вы можете использовать его, чтобы получить общее количество часов:

double foo = AmountOfTime(datacontext.Where(conditions)).TotalHours;
0 голосов
/ 02 марта 2009

Если конструкция SQL не поддерживает это, вы не можете ... Почему бы вам не создать специальное поле с числовым представлением времени, а затем добавить его вместе с помощью SQL.

...