Избегайте LINQ с ключевым словом Let, делающим цикл - PullRequest
0 голосов
/ 20 августа 2010

У меня есть три таблицы Student, TimeSheet и TimeRecord.

Столбики Талбе:

  • Студент: StudentId, AssignedId, FirstName, LastName

  • Расписание: TimeSheetId, StudentId, IsArchive, IsComplete

  • TimeRecord: TimeRecordId, TimeSheetId, BonusHour (тип int), CreationDate

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

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

Данные об ученике:

StudentId, AssignedId, FirstName, LastName

  • 100, 741, Макро, Джон
  • 101, 742, Hiro, Edge
  • 102, 743, Сара, Лимон и сын на ..

Данные образца расписания:

TimeSheetId, StudentId, IsArchive, IsComplete

  • 187, 100, True, False
  • 196, 101, True, False
  • 195, 102, True, False
  • 199, 100, правда, правда
  • 200, 102, правда, правда

Пример данных TimeRecord:

TimeRecordId, TimeSheetId, BonusHour, CreationDate

  • 1, 187, 1, 18.07.2010, 22:23:25
  • 2, 196, 2, 19.07.2010 14:23:25

  • 3, 187, 1, 01.08.2010 2: 5: 25 AM

  • 4, 187, 3, 9 августа 2010 г., 12:23:13

  • 5, 196, 0, 20.07.2010 18:15:25

  • 6, 196, 2, 18.09.2010 14:23:25

  • 7, 195, 3, 18.08.2010 14:23:25

  • 8, 199, 4, 18.07.2010 14:23:25

На самом деле, я пытаюсь получить ежемесячный бонусный час каждого студента.

    Dim query = From s In db.Students _
                 Let pair = (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.StudentId, .MonthYear = (tr.CreationDate.Value.Month & "/" & tr.CreationDate.Value.Year)} Into TotalHour = Sum(tr.BonusHour)) _
                From part In pair _
                Select New With {.stId = s.AssignedId, .MonthYear = part.key.MonthYear, .TotalHour = part.TotalHour}

Этот запрос проходит по элементу «pair» и присваивает его каждому ученику.

AssignedId , MonthYear, TotalHour

- 741, 6/2010 , 5
- 742, 6/2010 , 5
- 743, 6/2010 , 5
- 744, 6/2010 , 5
- 745, 6/2010 , 5

- 741, 7/2010 , 8
- 742, 7/2010 , 8
- 743, 7/2010 , 8
- 744, 7/2010 , 8
- 745, 7/2010 , 8

и т. Д. До последнего результата элемента "pair".

Итак, правильный результат должен быть таким:

- 741, 6/2010 , 5
- 742, 6/2010 , 8
- 743, 6/2010 , 9
- 744, 6/2010 , 10
- 745, 6/2010 , 15

Или вот так:

AssignedId, месяц / год, например:

AssignedId, 7/2010, 8/2010

 - 741 , 8hr, 2hr
 - 742, 3hr ,4hr
 - 743, 3hr, 1hr
 - and son on..

Можете ли вы помочь мне исправить мой запрос выше? Любые предложения в C # или VB.NET приветствуются. Спасибо.

Ответы [ 2 ]

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

Вместо того, чтобы начинать с ученика, я бы подумал начать с самого TimeRecord.До тех пор, пока ваше сопоставление Linq To Sql является правильным (и отношения установлены), у вас уже будут некоторые полезные свойства отношений для использования.Вот как я сформировал запрос, хотя при переходе на VB может потребоваться внести некоторые изменения.

var hours = from tr in db.TimeRecords
            where !tr.TimeSheet.IsArchive && !tr.TimeSheet.IsCompleted && tr.TimeOut != null
            group tr.BonusHour by
                new {
                        tr.TimeSheet.Student,
                        MonthYear = tr.CreationDate.Value.Month + "/" + tr.CreationDate.Value.Year
                    }
            into g
            select new {g.Key.Student.AssignedId, g.Key.MonthYear, TotalHour = g.Sum()};

Дайте мне знать, если ваша модель отличается, но эта идея должна работать для вас.

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

На верхнем уровне ваш запрос формируется из двух наборов результатов:

  1. db.Students
  2. пара, как определено в предложении Let.

Поскольку у вас есть два предложения From (одно для db.Students, одно для пары) на верхнем уровне и нет предложения Join или Where для связывания одного с другим, LINQ создает то, что по сути перекрестное соединение между ними.

Я думаю, что вы хотите либо Join второй набор результатов (пара) к первому (db.Students), либо иным образом указать их связь в предложении Where верхнего уровня.

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