【问题标题】:From SQL to C# LINQ [closed]从 SQL 到 C# LINQ [关闭]
【发布时间】:2017-12-02 17:43:27
【问题描述】:

我在将 SQL 转换为 LINQ 时遇到了一些问题,恰好是 Group by 和 Average 的混合。我尝试以不同的方式解决它,但没有预期的结果。

SQL:

SELECT TOP 3 
  AVG([Grade])
  ,[User].FirstName
  ,[User].Surname
  ,[Student].StudentID
  ,[Student].ClassID

FROM [Szkola].[dbo].[School_Class]
JOIN [Szkola].[dbo].[Student]
ON School_Class.ClassID = Student.ClassID
JOIN [Szkola].[dbo].[School_Grades] 
ON Student.StudentID = School_Grades.StudentID
JOIN [Szkola].[dbo].[Teacher] 
ON Teacher.TeacherID = School_Grades.TeacherID
JOIN [Szkola].[dbo].[User]
ON Student.UserID = [User].UserID

WHERE [Teacher].[Subject] = 'Mathematics'
GROUP BY [Student].[StudentID], [Student].[ClassID], [User].[FirstName], 
[User].[Surname]
ORDER BY AVG([Grade]) DESC

您能否描述一下您的解决方案的具体工作原理?我读过 LINQ 和 Group by,但我想我会在这个例子中更好地理解它。

非常感谢。

【问题讨论】:

  • 您需要搜索并阅读一些教程。到目前为止,您是否尝试过使用 LINQ 的任何方法
  • 在 SQL 平均和 GroupBy Linq 上进行谷歌搜索与 2 的定义无关,但最好你了解它与聚合等有关的内容。我将从那里开始.. 1000 的sql函数示例/在线解释
  • 能否请您展示您的工作代码,这可能是一个很好的起点。我们确实会帮助有特定问题的人,但我们不是来为您编写的。

标签: c# sql .net sql-server linq


【解决方案1】:

使用类来模拟你的数据库

    class Program
    {
        static void Main(string[] args)
        {
            List<School_Class> classes = new List<School_Class>();
            List<Student> students = new List<Student>();
            List<School_Grade> grades = new List<School_Grade>();
            List<Teacher> teachers = new List<Teacher>();
            List<User> users = new List<User>();

            var query = (from c in classes
                         join s in students on c.ClassID equals s.ClassID
                         join g in grades on s.StudentID equals g.StudentID
                         join t in teachers on s.StudentID equals t.TeacherID
                         join u in users on s.UserID equals u.UserID
                         select new { c = c, s = s, g = g, t = t, u = u })
                .Where(x => x.t.Subject == "Mathematics")
                .GroupBy(x => new { 
                     student = x.s.StudentID, 
                     _class = x.c.ClassID, 
                     firstname = x.u.FirstName, 
                     surname = x.u.SurName })
                .OrderByDescending(x => x.FirstOrDefault().g.grades.Average())
                .Select(x => new { firstname = x.Key.firstname, 
                                   surname = x.Key.surname, 
                                   sid = x.Key.student, 
                                   cid = x.Key._class, 
                                   avg = x.FirstOrDefault().g.grades.Average() })
                .Take(3).ToList();
        }
    }
    public class School_Class
    {
        public int ClassID { get; set; }
    }
    public class Student
    {
        public int ClassID { get; set; }
        public int StudentID { get; set; }
        public int UserID { get; set; }
    }
    public class School_Grade
    {
        public int StudentID { get; set; }
        public int TeacherID { get; set; }
        public List<int> grades { get; set; }
    }
    public class Teacher
    {
        public int TeacherID { get; set; }
        public string Subject { get; set; }
    }
    public class User
    {
        public string FirstName { get; set; }
        public string SurName { get; set; }
        public int UserID { get; set; }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2014-09-28
    • 2012-10-20
    相关资源
    最近更新 更多