如何在Linq方法中更改MYSQL连接查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Linq方法中更改MYSQL连接查询相关的知识,希望对你有一定的参考价值。

我编写了一个mysql连接代码,并希望从Dotnet Core 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名称和平均标记字段。

[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);
}
答案

您从数据库中选择了太多。这是一个例子,如何选择nessecary值:

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; }
}

以上是关于如何在Linq方法中更改MYSQL连接查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用方法语法在 LINQ 连接中添加多个条件

如何在代码中定义/更改 Linq To Sql 的映射

如何在 linq 查询中设置内连接

并行LINQ PLinq

如何使用方法语法在 linq to sql 中进行连接?

如何在 LINQ 中使用左外连接进行 SQL 查询?