I have a class that looks like this:
public class TaughtSubject
{
public int TaughtSubjectId { get; set; }
public int TeacherId { get; set; }
public Teacher Teacher { get; set; }
public int FormId { get; set; }
public Form FormId { get; set; }
public int SubjectId { get; set; }
public Subject Subject { get; set; }
}
I received a list of these objects and I want to get the least occurring one by the SubjectId then by FormId. I also want to get back the first whole element. Not just the property.
Here is my attempt:
var teacher = taughtSubjects.GroupBy(t => t.SubjectId).OrderBy(g => g.Count()).Select(g => g.Key).First();
But this only returns the SubjectId. I want the whole teacher object and to also add the second sort condition FormId.
You’re close. You need the first item of the Lookup (the result of the GroupBy you have), and then in the values for that element of the lookup you want to group by FormId and return the teacher(s) with the least-occurring one of those.
This will return an IEnumerable of Teachers with at least one element, representing the teacher(s) who teach the least-taught subject with the least-used form.
Understand that there may be Subjects in your system that aren’t taught at all. They will not be represented here, because no teacher exists that teaches the class. The query will only consider subjects with at least one teacher.
EDIT: After rereading your question, I think I understand what’s going on. These “taught subjects” relate to a particular subject (math, reading, science, art, music) taught to a particular “form” or “grade level” (1st grade-12th grade in the US system).
As you currently have your object set up, duplicate entries for the same subject and grade are possible, but they would be indistinguishable other than by the TaughtSubjectID field (which may just be assigned from a counter or identity).
It would make more sense, no matter how you’d want this done, to also include the Teacher in the TaughtSubject. That would, for instance, allow you to list the teachers who teach the least-taught subject in the least-taught grade for that subject, or alternately as David B suggests, the least-taught overall combination of subject and grade.
Which one you want is subjective, and there is a semantic difference. It is possible for Music to be the least-taught subject (only offered to 9th-12th graders), but for there to be two or three teachers teaching it at every grade level. Math on the other hand may be taught at every grade level with a high number of teachers overall and thus have a higher number of TaughtSubject records than Music, but there may only be one 6th-grade Math teacher out of the whole group. Finding the least-taught grade of the least-taught subject would give you 9th-grade Music. Finding the least-taught overall subject-grade combination would give you 6th grade Math.