2015-03-16 15 views
5

Ich habe den folgenden Code:Rückgabetyp Linq Gruppe von mehreren Spalte

var studentClassAttendancesGrouped = 
          classAttendanceByCriteria.OrderBy(x => x.Lecture.Id).GroupBy(x => new { x.Lecture, x.Teacher }); 

Ich versuche studentClassAttendancesGrouped von einem method.But zurückkehren ich den Rückgabetyp des Verfahrens nicht bestimmen kann.

Antwort

12

This Überlastung der GroupBy wird IEnumerable<IGrouping<TKey, TSource>> wie aus der source code angezeigt.

Sie müssen nur Ihr mit dem Select() enumerable projizieren und natürlich Sie ToList() am Ende rufen muss die Abfrage auszuführen und eine Liste zu erstellen:

var res = classAttendanceByCriteria.OrderBy(x => x.Lecture.Id) 
            .GroupBy(x => new { x.Lecture, x.Teacher }) 
            .Select(x => new {x.Key.Lecture, x.Key.Teacher}) 
            .ToList(); 

Aber der obige Code erstellt eine Liste der anonyme Typen. Wenn Sie vorhaben, die obige Aussage aus dem Verfahren zurück, dann müssen Sie verwenden oder ein benutzerdefiniertes Objekt und gibt die Liste der diese zu erstellen:

public class LectureTeacher 
{ 
    public string Lecture { get; set; } 
    public string Teacher { get; set; } 
} 

public List<LectureTeacher> GetDogsWithBreedNames() 
{ 
    var res = classAttendanceByCriteria.OrderBy(x => x.Lecture.Id) 
             .GroupBy(x => new { x.Lecture, x.Teacher }) 
             .Select(x => new LectureTeacher {Lecture = x.Key.Lecture, Teacher = x.Key.Teacher}) 
             .ToList(); 

    return res; 
} 

By the way,GroupBy haben mehrere andere Überlastungen, die Sie Ergebnisauswahl und es wird wieder IEnumerable Sie angeben können:

myList.OrderBy(x => x.Lecture.Id) 
     .GroupBy(x => new { x.Lecture, x.Teacher } //key selector 
       key => new LectureTeacher // result selector 
       { 
        Lecture = key.Lecture, 
        Teacher = key.Teacher 
       }) 
     .ToList(); 
2

ich würde Ihnen vorschlagen, eine benutzerdefinierte Klasse zu erstellen und senden Sie es aus Ihrer Methode: -

IEnumerable<CustomType> studentClassAttendancesGrouped = 
     classAttendanceByCriteria.OrderBy(x => x.Lecture.Id) 
     .GroupBy(x => new { x.Lecture, x.Teacher }) 
     .Select(x => new CustomType { Lecture = x.Key.Lecture, Teacher = x.Key.Teacher }); 

Wo, CustomType wird wie folgt aussehen: -

public class CustomType 
{ 
    public string Lecture {get; set; } 
    public string Teacher {get; set; } 
} 

Sie mehr Spalten nach Ihrem Bedarf hinzufügen und schließlich IEnumerable<CustomType> aus Ihrer Methode zurück.

So wird Ihre Methode wie folgt aussehen: -

public IEnumerable<CustomType> MyMethod() 
{ 
    return classAttendanceByCriteria.OrderBy(x => x.Lecture.Id) 
     .GroupBy(x => new { x.Lecture, x.Teacher }) 
     .Select(x => new CustomType { Lecture = x.Key.Lecture, Teacher = x.Key.Teacher }); 
}