LINQ to SQL сумма пустое значение - PullRequest
2 голосов
/ 20 августа 2010

У меня следующий запрос, я хотел бы также суммировать значение NULL. Некоторые TimeSheet не записывают в TimeRecord, а некоторые tr.TimeIn и tr.TimeOut имеют значение NULL.

В запросе выбирается только расписание, в котором есть записи в TimeRecord. Как я могу выбрать все, и суммировать значение NULL, а также. Таким образом, сумма NULL будет равна нулю.

Таблица отношений:

  • Ученик 1: N TimeSheet (FK StudentId)
  • Расписание 1: N TimeRecord (FK TimeSheetId)

TimeIn и TimeOut имеют тип DateTime и могут иметь значение null.

Запрос 1: Ежемесячный отчет:

    Dim query = From ts In db.TimeSheets _
        Join tr In db.TimeRecords On tr.TimeSheetId Equals ts.TimeSheetId _
 Where ts.IsArchive = False And ts.IsCompleted = False And tr.TimeOut IsNot Nothing _
 Group By key = New With {ts.Student, .MonthYear = (tr.TimeOut.Value.Month & "/" & tr.TimeOut.Value.Year)} Into TotalHour = Sum(DateDiffSecond(tr.TimeIn, tr.TimeOut)) _
                 Select key.Student.StudentId, key.Student.AssignedId, key.MonthYear, TotalHour 

Запрос 2: Общее время записи для ученика с активным расписанием:

Dim query = From ts In db.TimeSheets _
             Join tr In db.TimeRecords On tr.TimeSheetId Equals ts.TimeSheetId _
             Where ts.IsArchive = False And ts.IsCompleted = False _
             Group By ts.StudentId, tr.TimeSheetId Into TotalTime = Sum(DateDiffSecond(tr.TimeIn, tr.TimeOut)) _
             Select StudentId, TimeSheetId, TotalTime

Вот результат запроса 2:

  • 734 - 159: 9 часов 35 мм 28 секунд
  • 2655 - 160: 93 часа 33 мм 50 секунд
  • 1566 - 161: 37 ч. 23 мм 53 с.
  • 3114 - 162: 25 часов 0 мм 21 секунда

Требуемый результат запроса 2:

  • 733 - 158: 0 ч. 0 мм 0 с
  • 734 - 159: 9 часов 35 мм 28 секунд
  • 736 - 169: 0 часов 0 мм 0 секунд
  • 2655 - 160: 93 часа 33 мм 50 секунд
  • 1566 - 161: 37 ч. 23 мм. 53 с.
  • 3114 - 162: 25 часов 0 мм 21 с

То же самое для запроса 1, но он составляет ежемесячный отчет.

1 Ответ

1 голос
/ 20 августа 2010

Я извиняюсь, потому что я перевел ваш запрос на C # перед его настройкой, и я не очень хорошо знаю синтаксис VB, чтобы перевести его обратно, но я надеюсь, что вы сможете.Я попробовал следующий запрос, и он делает то, что вы просили:

var query = from st in Students
    select new
    {
        st.StudentId,
        st.AssignedId,
        TotalHour = (
            from ts in TimeSheets
            where ts.StudentId == st.StudentId
            join tr in TimeRecords on ts.TimeSheetId equals tr.TimeSheetId
            where !ts.IsArchive && !ts.IsCompleted && tr.TimeOut != null
            select (tr.TimeOut.Value - tr.TimeIn).TotalHours
        ).Sum()
    };

Мне пришлось удалить вещь MonthYear, потому что я не совсем понял, как это вписывается в вашу группировку, но так как это не такв выводе я подозревал, что, возможно, вам это не нужно.

Мне пришлось сделать несколько предположений:

  • Я предполагаю, что TimeOut являетсяDateTime? (обнуляется), в то время как TimeIn равно DateTime (не обнуляется).Я думаю, что это имеет смысл.

  • Я предполагаю, что у TimeSheets есть StudentId, который связывает их со студентами.

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