Shiro
Shiro

Reputation: 5

C# Linq Joining queries

I am trying to create a query that joins the Student and Enrolled data on the ID and StudentID fields so that I may display only the names of the students who are enrolled in History, which would only be Steve Thomas as his ID is 3, as is the StudentID required for History.

My other query I made (IEnumerable student query) only accessed the student data, not enrolled. So I am unsure as to how I join the two together. Would I use multiple from's?

class Student
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int ID { get; set; }
    public DateTime DateOfBirth { get; set; }

}

class Enrolled
{
    public int StudentID { get; set; }
    public string CourseName { get; set; }
}
IEnumerable<Student> students = new List<Student>()
{
    new Student {FirstName = "Jim", LastName = "Smith", DateOfBirth = new DateTime(1990, 5, 21), ID = 1},
    new Student {FirstName = "Diane", LastName = "Sawyer", DateOfBirth = new DateTime(1992, 11, 1), ID = 2},
    new Student {FirstName = "Steve", LastName = "Thomas", DateOfBirth = new DateTime(1994, 4, 4), ID = 3},
    new Student {FirstName = "Pablo", LastName = "Dicaz", DateOfBirth = new DateTime(1973, 3, 30), ID = 4},
    new Student {FirstName = "Hannu", LastName = "Korppi", DateOfBirth = new DateTime(1988, 6, 16), ID = 5},
    new Student {FirstName = "Marie", LastName = "St. Claude", DateOfBirth = new DateTime(1982, 1, 19), ID = 6}
};


var enrolllist = new List<Enrolled>
{
    new Enrolled {CourseName = "Computer Science",StudentID = 2},
    new Enrolled {CourseName = "Computer Science",StudentID = 5},
    new Enrolled {CourseName = "History",StudentID = 1},
    new Enrolled {CourseName = "Psychology",StudentID = 2},
    new Enrolled {CourseName = "History",StudentID = 4},
    new Enrolled {CourseName = "Computer Science",StudentID = 3},
    new Enrolled {CourseName = "Psychology",StudentID = 6},
    new Enrolled {CourseName = "History",StudentID = 3},
};

IEnumerable<Student> query = from s in students
                             where s.DateOfBirth.Year < 1990
                             orderby s.FirstName
                             select s;

foreach (Student stud in query)
{
    Console.WriteLine(stud.FirstName);
    Console.ReadLine();
}

Upvotes: 0

Views: 166

Answers (1)

Grant Winney
Grant Winney

Reputation: 66439

You can join the two collections similar to how you'd join two tables in an SQL query.

var query = (from s in students
             join e in enrolllist on s.ID equals e.StudentID
             where e.CourseName == "History"
             select s)

The students.ID field is joined to the enrolled.StudentID field.

You can read more about how join works here and here.

Upvotes: 1

Related Questions