Как изменить MYSQL Join Query в методах Linq - PullRequest
1 голос
/ 26 апреля 2019

Я пишу код соединения MySql и хочу получить то же значение из методов Dotnetcore linq.

Мой код соединения указан ниже:

  SELECT GL.Id  AS GradeLevels,
         CRS.Name AS CourseName,
         GL.Title AS GradlevelName,
         AVG (ASTSTU.ObtainedMarks)
    FROM GradeLevels GL
         INNER JOIN Courses AS CRS ON CRS.GradeLevelsID = GL.Id
         INNER JOIN Units AS UNT ON UNT.CourseID = CRS.ID
         INNER JOIN Lessons AS LSN ON LSN.UnitsId = UNT.Id
         INNER JOIN Assignments AS AST ON AST.LessonId = LSN.id
         INNER JOIN AssignmentStudents AS ASTSTU ON ASTSTU.AssignmentId = AST.id
   WHERE CRS.SchoolSystemsID = "08d6a1f2-26df-4ad5-25d3-2a26960aa3fd" -- School System id.
GROUP BY GL.Id;

Теперь я хочу изменить выше MySQLПрисоединитесь к основному методу Dotnet linq, чтобы создать API, который будет Показывать, я пытаюсь написать код для этого

public async Task<ICollection<GradeLevels>> GetSchoolSystemGradLevelsAverage(Guid schoolSystemId)
{
    List<GradeLevels> dashboadOverAllAverage = new List<GradeLevels>();

    var dashboadOverAllAverage1 = await _GpsContext.GradeLevels
        .Include(d=>d.Departments)
        .ThenInclude(c=>c.Courses.Where(s=>s.SchoolSystemsID ==schoolSystemId))
        .ThenInclude(u=>u.Units)
        .ThenInclude(l=>l.Lessons)
        .ThenInclude(a=>a.Assignment)
        .ThenInclude(a=>a.assignmentStudents)
        .GroupBy(g=>g.ID)
        .ToListAsync();
    return dashboadOverAllAverage;
}

Теперь я хочу показать данные через API и хочу вызвать поля GradeLvels name и Average.Знаки.

[HttpGet()]
public async Task<IActionResult> GetCEOGradeLevelAverage(string schoolSystemId)
{
    var overallgradeAverages = await _ceoDashboadRepository.GetSchoolSystemGradLevelsAverage(Guid.Parse(schoolSystemId));
    List<GetGradeLevelAverageVm> getOverallAverageVms = new List<GetGradeLevelAverageVm>();

    foreach (GradeLevels overallgradeAverage in overallgradeAverages)
    {
        getOverallAverageVms.Add(new GetGradeLevelAverageVm
        {
            Marks = overallgradeAverage.Id.ToString(), //Want to show lable of AvrageMark
            Name = overallgradeAverage.Name //Want to show Gradelevel name
        });
    }
    return Ok(getOverallAverageVms);
}

1 Ответ

0 голосов
/ 26 апреля 2019

Вы слишком много выбираете из своей БД.Вот пример того, как выбрать ненужные значения:

using (TestDbContext ctx = new TestDbContext())
{
    var tmp = ctx.AssignmentStudents
        .Include(s => s.Assignment) // Include all Childs..
        .ThenInclude(a => a.Lesson)
        .ThenInclude(l => l.Unit)
        .ThenInclude(u => u.Course)
        .ThenInclude(c => c.GradeLevel)
        .Where(a => a.LessonId == 123)
        .GroupBy(g => // Group by your Key-Values Grade and Course (You could take names instead of ids. Just for simplification)
        new
        {
            GradeLevel = g.Assignment.Lesson.Unit.Course.GradeLevel.Id,
            Course = g.Assignment.Lesson.Unit.Course.Id
        })
        .Select(s => // Select the result into an anonymous type
        new
        {
            GradeLevels = s.Key.GradeLevel, // with same keys like grouping
            Course = s.Key.Course,
            AverageObtainedMarks = s.Average(a => a.ObtainedMarks) // and an average ObtainedMarks from objects matching the key
        })
        .Where(s => s.GradeLevel == 1);

    foreach (var t in tmp)
    {
        Console.WriteLine(t.GradeLevels + " " + t.Course + ": " + t.AverageObtainedMarks);
    }
}

Вот классы и dbcontext, которые я использовал:

public class GradeLevel
{
    public int Id { get; set; }
    public List<Course> Courses { get; set; }
}
public class Course
{
    public int Id { get; set; }
    public int GradeLevelId { get; set; }
    public GradeLevel GradeLevel { get; set; }
    public List<Unit> Units { get; set; }
}
public class Unit
{
    public int Id { get; set; }
    public int CourseId { get; set; }
    public Course Course { get; set; }
    public List<Lesson> Lessons { get; set; }
}
public class Lesson
{
    public int Id { get; set; }
    public int UnitId { get; set; }
    public Unit Unit { get; set; }
    public List<Assignment> Assignments { get; set; }
}
public class Assignment
{
    public int Id { get; set; }
    public int LessonId { get; set; }
    public Lesson Lesson { get; set; }
    public List<AssignmentStudent> AssignmentStudents { get; set; }

}
public class AssignmentStudent
{
    public int Id { get; set; }
    public int AssignmentId { get; set; }
    public Assignment Assignment { get; set; }
    public decimal ObtainedMarks { get; set; }
}

public class TestDbContext : DbContext
{
    public DbSet<AssignmentStudent> AssignmentStudents { get; set; }
    public DbSet<Assignment> Assignments { get; set; }
    public DbSet<Lesson> Lessons { get; set; }
    public DbSet<Unit> Units { get; set; }
    public DbSet<Course> Courses { get; set; }
    public DbSet<GradeLevel> GradeLevels { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...