C# 如何在Linq方法中更改MYSQL连接查询
我编写了一个MySql连接代码,希望从Dotnetcore linq方法中检索相同的值 我的加入代码如下:C# 如何在Linq方法中更改MYSQL连接查询,c#,.net-core,linq-to-sql,C#,.net Core,Linq To Sql,我编写了一个MySql连接代码,希望从Dotnetcore linq方法中检索相同的值 我的加入代码如下: 选择总账Id作为等级, CRS.名称为CourseName, 总帐名称为GradlevelName, 平均值(ASTSTU.获得的马克) 从等级GL 内部连接课程作为CRS上的CRS.GradeLevelsID=GL.Id UNT.CourseID=CRS.ID上的内部连接单元为UNT 在LSN.UnitsId=UNT.Id上作为LSN的内部联接课程 内部联接分配为AST ON AST.L
选择总账Id作为等级,
CRS.名称为CourseName,
总帐名称为GradlevelName,
平均值(ASTSTU.获得的马克)
从等级GL
内部连接课程作为CRS上的CRS.GradeLevelsID=GL.Id
UNT.CourseID=CRS.ID上的内部连接单元为UNT
在LSN.UnitsId=UNT.Id上作为LSN的内部联接课程
内部联接分配为AST ON AST.LessonId=LSN.id
在ASTSTU.AssignmentId=AST.id上作为ASTSTU的内部联接赋值学生
其中CRS.SchoolSystemsID=“08d6a1f2-26df-4ad5-25d3-2a26960aa3fd”--学校系统id。
按总账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;
}
公共异步任务GetSchoolSystemGradLevelsAverage(Guid schoolSystemId)
{
列表Dashboard平均值=新列表();
var dashboadverallaverage1=等待_GpsContext.GradeLevels
.包括(d=>d.部门)
.然后包括(c=>c.Courses.Where(s=>s.SchoolSystemsID==schoolSystemId))
。然后包括(u=>u.单位)
.然后包括(l=>l.课程)
.然后包括(a=>a.赋值)
.然后包括(a=>a.作业学生)
.GroupBy(g=>g.ID)
.ToListAsync();
返回Dashboard平均值;
}
现在我想通过API显示数据,并想调用字段GradeLvels name和Average Marks
[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);
}
[HttpGet()]
公共异步任务GetCEOGradeLevelAverage(字符串schoolSystemId)
{
var Overall Grade Averages=await _ceoDashboardepository.GetSchoolSystemGradeLevelSaveRage(Guid.Parse(schoolSystemId));
List getOverallAverageVms=new List();
foreach(总成绩平均值中的总成绩平均值)
{
添加(新的GetGradeLevelAverageVm
{
Marks=overallgradeAverage.Id.ToString(),//要显示AvrageMark的标签吗
Name=overallgradeAverage.Name//要显示成绩级别名称吗
});
}
返回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; }
}
公共班级等级
{
公共int Id{get;set;}
公共列表课程{get;set;}
}
公共课
{
公共int Id{get;set;}
public int GradeLevelId{get;set;}
公共级别{get;set;}
公共列表单元{get;set;}
}
公营课组
{
公共int Id{get;set;}
public int CourseId{get;set;}
公共课程{get;set;}
公共列表课程{get;set;}
}
公共课
{
公共int Id{get;set;}
public int UnitId{get;set;}
公共单位单位{get;set;}
公共列表分配{get;set;}
}
公共课堂作业
{
公共int Id{get;set;}
公共int LessonId{get;set;}
公共课程{get;set;}
公共列表分配学生{get;set;}
}
公共班级分配学生
{
公共int Id{get;set;}
public int AssignmentId{get;set;}
公共赋值{get;set;}
公共十进制获得标记{get;set;}
}
公共类TestDbContext:DbContext
{
公共DbSet赋值学生{get;set;}
公共数据库集分配{get;set;}
公共数据库集课程{get;set;}
公共数据库集单元{get;set;}
公共数据库集课程{get;set;}
公共数据库集级别{get;set;}
}
我已经有了相同的dbcontext,我所做的是让Join(在mysql中)检索数据,我想将所有的Join in Linq方法转换为在dotnet core中创建API。dbcontext和数据类用于测试。上面的示例显示了如何联接表(包括属性)m将它们正确分组并选择所需的字段。如何在给定示例中添加where条件,就像在联接中提到的一样,“SchoolSystemId”将是课程表中的字段。@VipinJha where where where you want。分组之前或之后。我确实在示例中添加了两个Where
-条件。