2017-12-02 2 views
0

私は、LINQへのSQLの変換には、Group byとAverageの組み合わせでいくつか問題があります。私はさまざまな方法でそれを解決しようとしましたが、予期せぬ結果はありませんでした。SQLからC#LINQ

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を読んでいますが、私はこの例でもっと理解すると思います。

ありがとうございました。

+0

をシミュレートするためのクラスを使用しました。今までLINQを使って何か試してみましたか? –

+0

SQL平均とGroupBy Linqのgoogle検索は2の定義とは関係ありませんが、集計などについては理解していることが一番です。 1000のSQL関数の例/説明のオンライン – MethodMan

+0

努力のコードを表示してください、それは良い出発点かもしれません。私たちは特定の問題を持つ人々を助けますが、私たちはあなたのためにそれを書くのではありません。 –

答えて

2

あなたが検索してチュートリアルのいくつかを読む必要があり、データベース

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