Обратное проектирование некоторых отчетов, содержащих неверные данные. Отчеты, написанные на Asp.Net C # с использованием Linq

Я могу написать запрос в БД, но не могу перевести на Linq.

public StudentBehaviourActivityDTO GetStudentBehaviourActivity(
            Guid userId)
        {
            List<DateTime> lastUpdatedDates = Uow.ActivityTrackingUnitValues
                .Where(atuv => atuv.Last_Updated_On != null
                    && atuv.TBH_Activity_Tracking_Unit
                        .StudentBehaviour
                        .Student
                        .TeamMembers
                        .Any(tm => tm.Id == userId))
                        .Select(atuv => (DateTime)DbFunctions
                            .TruncateTime(atuv.Last_Updated_On))
                        .ToList();

Что это за загрузка в toList? Я предполагаю, что это загружает мою таблицу: ActivityTrackingUnitValues

Но тогда это также происходит, тогда также похоже, что он присоединяется к этим таблицам

.StudentBehaviour
.Student
.TeamMembers

Я хочу взять максимальное (значение) для Last_Updated_On, а затем сгруппировать по студентам

Любая помощь или объяснение приветствуются.

0
Joshua Boyd 18 Сен 2018 в 00:57

2 ответа

Лучший ответ

Что это за загрузка в toList?

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

.StudentBehaviour
.Student
.TeamMembers

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

Поэтому в деталях он делает следующее:

  1. Получает список значений единиц отслеживания активности, где:
    • Значение единицы отслеживания активности обновлено.
    • Учащийся, которого мы проверяем, является членом команды со студентом, поведение которого отслеживается подразделением, ответственным за это значение единицы отслеживания активности.
  2. Выбирает день последнего обновления этих значений.

Я хочу взять максимальное (значение) для Last_Updated_On, а затем сгруппировать по студентам

Составить базовый набор данных:

.Select(atuv => new 
{ 
    LastUpdatedDate = (DateTime)DbFunctions.TruncateTime(atuv.Last_Updated_On)),
    StudentId = atuv.TBH_Activity_Tracking_Unit.StudentBehaviour.Student.Id
})

Группа по идентификатору студента:

.GroupBy(sd => sd.StudentId)

Выберите студента и максимальную дату последнего обновления:

.Select(sd => new { StudentId = sd.Key, MaxDate = sd.Max(d => d.LastUpdatedDate) });

В итоге это будет выглядеть примерно так:

var maxUpdatedDatePerStudentList = Uow.ActivityTrackingUnitValues
                    .Where(atuv => atuv.Last_Updated_On != null
                                && atuv.TBH_Activity_Tracking_Unit
                                       .StudentBehaviour
                                       .Student
                                       .TeamMembers
                                       .Any(tm => tm.Id == userId))
                    .Select(atuv => new 
                    { 
                        LastUpdatedDate = (DateTime)DbFunctions.TruncateTime(atuv.Last_Updated_On)),
                        StudentId = atuv.TBH_Activity_Tracking_Unit.StudentBehaviour.Student.Id
                    })
                    .GroupBy(sd => sd.StudentId)
                    .Select(sd => new { StudentId = sd.Key, MaxDate = sd.Max(d => d.LastUpdatedDate) })
                    .ToList();

И вы можете получить доступ к его данным следующим образом:

maxUpdatedDatePerStudentList.ForEach(g => Console.WriteLine($"Student {g.StudentId} max updated date is {g.MaxDate}"));
0
Ahmed Sherien 18 Сен 2018 в 00:35
public StudentBehaviourActivityDTO GetStudentBehaviourActivity(
        Guid userId)
    {
        List<DateTime> lastUpdatedDates = Uow.ActivityTrackingUnitValues
            .Where(atuv => atuv.Last_Updated_On != null // check to make sure it's not null
                && atuv.TBH_Activity_Tracking_Unit
                    .StudentBehaviour //this references a class (generally a join, but it doesn't join!)
                    .Student //this references a class (generally a join, but it doesn't join!)
                    .TeamMembers //this references a class (generally a join, but it doesn't join!)
                    .Any(tm => tm.Id == userId)) // Checks to make sure it isn't null or has a count greater than 0
                    .Select(atuv => (DateTime)DbFunctions
                        .TruncateTime(atuv.Last_Updated_On)) // Returns the truncatedtime and nowthing else
                    .ToList(); // converts it to a list

Насколько я могу судить, он проверяет, есть ли в классе участники.

0
Monofuse 17 Сен 2018 в 22:49