Example #1
0
        static void Main(string[] args)
        {
            PruefDb db = PruefDb.FromMockup();

            // *************************************************************************************
            // MUSTERBEISPIELE
            // *************************************************************************************
            // 1. Suche den Schüler mit der ID 1003
            //    Where liefert IEnumerable, also immer eine Collecion.
            //    Deswegen brauchen wir First, um auf das erste Element zugreifen
            //    zu können.
            Schueler result1 = db.Schuelers.Where(s => s.Id == 1003).First();

            // 2. Welcher Schüler hat die Id 999?
            //    First liefert eine Exception, da die Liste leer ist.
            //    FirstOrDefault liefert in diesem Fall den Standardwert (null).
            Schueler result2 = db.Schuelers.Where(s => s.Id == 999).FirstOrDefault();

            // 3. Wie viele Schüler sind in der Liste?
            int result3 = db.Schuelers.Count();

            // 4. Wie viele Schüler gehen in die 3BHIF?
            int result4 = db.Schuelers.Where(s => s.Klasse == "3BHIF").Count();

            //    Für Count existiert eine Überladung, die auch eine Filterfunktion
            //    bekommen kann.
            result4 = db.Schuelers.Count(s => s.Klasse == "3BHIF");

            // *************************************************************************************
            // ÜBUNGEN
            // *************************************************************************************
            // 5. Welche Note hat die Prüferin FAV bei ihrer schlechtesten Prüfung vergeben.
            // Schreibe das Ergebnis mit dem richtigen Datentyp in die Variable result5 (kein var verwenden!).
            object result5 = null;

            Console.WriteLine($"Beispiel 5: FAV gab schlechtestens die Note {result5}.");

            // 6. Welchen Notendurchschnitt haben die weiblichen Schülerinnen in POS?
            // Schreibe das Ergebnis mit dem richtigen Datentyp in die Variable result6 (kein var verwenden!).
            object result6 = null;

            Console.WriteLine($"Beispiel 6: Notenschnitt der Schülerinnen in POS: {result6:0.00}");

            // 7. Welche Schüler haben 6 oder mehr Prüfungen? Gib eine Liste von Schülern zurück und gib Sie aus.
            // Schreibe das Ergebnis mit dem richtigen Datentyp in die Variable result7 (kein var verwenden!).
            object result7 = null;

            Console.WriteLine("Beispiel 7: Schüler mit mehr als 6 Prüfungen.");
            result7.ToList().ForEach(s => { Console.WriteLine($"   {s.Name} {s.Vorname} hat mehr 6 oder mehr Prüfungen."); });

            // 8. Welche Schüler haben eine DBI Prüfung? Gib eine Liste von Schülern zurück und gib sie aus.
            //    Hinweis: kombiniere Where und Any, indem Any in der Where Funktion verwendet wird.
            // Schreibe das Ergebnis mit dem richtigen Datentyp in die Variable result8 (kein var verwenden!).
            object result8 = null;

            Console.WriteLine("Beispiel 8: Schüler mit DBI Prüfungen.");
            result8.ToList().ForEach(s => { Console.WriteLine($"   {s.Name} {s.Vorname} hat eine DBI Prüfung."); });

            // 9. Gibt es Schüler, die nur in POS eine Prüfung haben? Gib eine Liste von Schülern zurück und gib sie aus.
            //    Hinweis: kombiniere Where und All, indem All in der Where Funktion verwendet wird.
            //    All gibt auch Schüler aus, die keine Prüfung haben. Dies kann so belassen werden.
            // Schreibe das Ergebnis mit dem richtigen Datentyp in die Variable result9 (kein var verwenden!).
            object result9 = null;

            Console.WriteLine("Beispiel 9: Schüler, die nur in POS eine Prüfung haben.");
            result9.ToList().ForEach(s => { Console.WriteLine($"   {s.Name} {s.Vorname} hat nur in POS eine Prüfung."); });

            // 10. Welche Schüler haben keine POS Prüfung? Gib eine Liste von Schülern zurück und gib sie aus.
            //    Hinweis: kombinieren Where und Any, indem Any in der Where Funktion verwendet wird.
            // Schreibe das Ergebnis mit dem richtigen Datentyp in die Variable result10 (kein var verwenden!).
            object result10 = null;

            Console.WriteLine("Beispiel 10: Schüler, die keine POS Prüfung haben.");
            result10.ToList().ForEach(s => { Console.WriteLine($"   {s.Name} {s.Vorname} hat keine POS Prüfung."); });

            // 11. Welche Schüler haben überhaupt keine Prüfung? Gib eine Liste von Schülern zurück und gib sie aus.
            //     Hinweis: Verwende das Count Property.
            // Schreibe das Ergebnis mit dem richtigen Datentyp in die Variable result11 (kein var verwenden!).
            object result11 = null;

            Console.WriteLine("Beispiel 11: Schüler, die überhaupt keine Prüfung haben.");
            result11.ToList().ForEach(s => { Console.WriteLine($"   {s.Name} {s.Vorname} hat keine Prüfung."); });

            // 12. Welche Schüler hatten in Juni AM Prüfungen? Gib eine Liste von Prüfungen zurück und gib sie mit dem Schülernamen aus.
            //     Hinweis: Verwende das Month Property des Datum Feldes.
            // Schreibe das Ergebnis mit dem richtigen Datentyp in die Variable result12 (kein var verwenden!).
            object result12 = null;

            Console.WriteLine("Beispiel 12: Schüler, die im Juni eine AM Prüfung hatten.");
            result12.ToList().ForEach(p => { Console.WriteLine($"   {p.Schueler.Name} {p.Schueler.Vorname} hat bei {p.Pruefer} eine Prüfung in AM."); });

            // 13. Welche Schüler haben bei einer AM Prüfung eine negative Note,
            //     aber in E nur positive Prüfungen?
            // Schreibe das Ergebnis mit dem richtigen Datentyp in die Variable result13 (kein var verwenden!).
            object result13 = null;

            Console.WriteLine("Beispiel 13: Schüler, die in AM einmal negativ, aber in E immer positiv waren.");
            result13.ToList().ForEach(s => { Console.WriteLine($"   {s.Name} {s.Vorname} war in AM negativ, in E aber nie."); });

            // 14. Welche Schüler haben im Mittel bessere DBI Prüfungen als D Prüfungen. Anders gesagt: Bei wem
            //     ist der Notenschnitt der DBI Prüfungen kleiner als der Notenschnitt der D Prüfungen.
            //     Gib eine Liste von Schülern zurück, auf die das zutrifft.
            //     Hinweise:
            //       -) Wenn mit Where gefiltert wird, kann es sein, dass eine leere Liste zurückkommt.
            //       -) Average kann nur von einer Liste mit Elementen aufgerufen werden.
            //       -) Erstelle daher eine Lambda Expression mit try und catch im inneren, die false im Fehlerfall liefert.
            // Schreibe das Ergebnis mit dem richtigen Datentyp in die Variable result14 (kein var verwenden!).
            object result14 = null;

            Console.WriteLine("Beispiel 14: Schüler, in DBI bessere Prüfungen (Notenschnitt) als in D hatten.");
            result14.ToList().ForEach(s => { Console.WriteLine($"   {s.Name} {s.Vorname} ist in DBI besser als in D."); });
        }
Example #2
0
        static void Main(string[] args)
        {
            PruefDb db = PruefDb.FromMockup();

            // *************************************************************************************
            // MUSTERBEISPIELE
            // *************************************************************************************

            // Liefere eine Liste aller Prüfungsfächer (IEnumerable<string>)
            // Mit Select kann man sich aussuchen, welche Properties geliefert werden.
            // Select nennt man auch "Projektion"

            IEnumerable <string> uebung1 = db.Pruefungen.Select(p => p.Fach);
            // Liste beinhaltet D, E, E, AM, D, AM, ...

            IEnumerable <string> uebung2 = db.Pruefungen.Select(p => p.Fach).Distinct();
            // Liste beinhaltet D, E, AM, POS, DBI (jedes Fach nur 1x)

            // Liefere eine Liste aller Schüler mit der Anzahl der Prüfungen
            // als Objekt Name, Vorname, Anzahl
            // Der Compiler legt eine anonyme Klasse an:
            // class A {
            //   string Name {get;set;}
            //   string Vorname {get;set;}
            //   int Anzahl {get;set;}
            // }
            var uebung3 = db.Schuelers.Select(s => new
            {
                Name    = s.Name,
                Vorname = s.Vorname,
                Anzahl  = s.Pruefungen.Count()  // Propertynamen festlegen
            }).OrderBy(x => x.Anzahl).ThenBy(x => x.Name);

            // Welche Schüler haben mehr als 6 Prüfungen?
            var uebung4 = uebung3.Where(p => p.Anzahl > 6);

            // Liefere ein JSON Objekt mit folgendem Aufbau:
            // {
            //    Name: Mustermann,
            //    Vorname: Max,
            //    Pruefer: [KY, FAV]
            // },...
            var uebung5 = db.Schuelers.Select(s => new
            {
                s.Name,
                s.Vorname,
                Pruefer = s.Pruefungen.Select(p => p.Pruefer).Distinct()
            });

            WriteJson(uebung5, "Beispiel 5 - Schüler mit Prüfer", true);


            // Liefere ein JSON Objekt mit folgendem Aufbau:
            // {
            //    Name: "Mustermann,"
            //    Vorname: "Max",
            //    db.Pruefungen: [{"Pruefer"="KY", "Fach"="AM"}, ...]
            // },...
            var uebung6 = db.Schuelers
                          .Where(s => s.Id < 1010)
                          .Select(s => new
            {
                s.Name,
                s.Vorname,
                Pruefungen = s.Pruefungen.Select(p => new
                {
                    p.Pruefer,
                    p.Fach
                }),
                Anzahl = s.Pruefungen.Count(),
            });

            WriteJson(uebung6, "Beispiel 6 - Schüler mit Prüfungen", true);


            // *************************************************************************************
            // ÜBUNGEN
            // Schreibe in den nachfolgenden Übungen statt der Zeile
            // object resultX = null;
            // die korrekte LINQ Abfrage. Verwende den entsprechenden Datentyp statt object.
            // *************************************************************************************

            // 1. Drucke eine Liste aller Fächer. Hinweis: Verwende Distinct, um doppelte Einträge
            //    zu entfernen. Speichere das Ergebnis in IEnumerable<string>.

            IEnumerable <string> result1 = db.Pruefungen
                                           .Select(p => p.Fach)
                                           .Distinct();

            Console.WriteLine("Die Prüfungsfächer sind " + String.Join(",", result1));

            // 2. Ermittle die schlechteste Prüfungsnote in E. Dabei verwende allerdings die Max
            //    Funktion ohne Parameter, indem vorher eine Liste von int Werten erzeugt wird.

            int result2 = db.Pruefungen
                          .Where(p => p.Fach == "E")
                          .Select(p => p.Note)
                          .Max();

            Console.WriteLine($"Die schlechteste E Note ist {result2}");

            // 3. Liefere eine Liste mit Klasse, Name, Vorname und der Anzahl der Prüfungen
            //    (soll Anzahl heißen) der 3CHIF. Sortiere die Liste nach Klasse und Name.
            //    Hinweis: Verwende OrderBy und dann ThenBy.

            var result3 = db.Schuelers
                          .Where(s => s.Klasse == "3CHIF")
                          .OrderBy(s => s.Klasse)
                          .ThenBy(s => s.Name)
                          .Select(s => new
            {
                s.Klasse,
                s.Vorname,
                s.Name,
                Anzahl = s.Pruefungen.Count(),
            });

            Console.WriteLine("Beispiel 3");
            result3.ToList().ForEach(s => { Console.WriteLine($"   {s.Klasse}: {s.Name} {s.Vorname} hat {s.Anzahl} Prüfungen."); });

            // 4. Liefere eine Liste der Schüler (Klasse, Name, Vorname) der 3BHIF mit ihren Prüfungsfächern.
            //    Die Fächer sollen als Stringliste (IEnumerable<string> ohne doppelte Einträge
            //    in das Property Faecher gespeichert werden.

            var result4 = db.Schuelers
                          .Where(s => s.Klasse == "3BHIF")
                          .Select(s => new
            {
                s.Klasse,
                s.Name,
                s.Vorname,
                Faecher = s.Pruefungen.Select(p => p.Fach).Distinct()
            });

            Console.WriteLine("Beispiel 4");
            result4.ToList().ForEach(s => { Console.WriteLine($"   {s.Klasse}: {s.Name} {s.Vorname} hat {String.Join(",", s.Faecher)}"); });

            // 5. Liefere eine Liste aller Schüler der 3AHIF (Name, Vorname) mit ihren negativen
            //    Prüfungen. Dabei soll unter dem Property "NegativePruefungen"
            //    ein neues Objekt mit Datum und Fach aller negativen Prüfungen (Note = 5)
            //    erzeugt werden. Es sind natürlich 2 new Anweisungen nötig.
            //    Außerdem sollen nur Schüler der 3AHIF berücksichtigt werden.

            var result5 = db.Schuelers
                          .Where(s => s.Klasse == "3AHIF")
                          .Select(s => new
            {
                s.Name,
                s.Vorname,
                NegativePruefungen = s.Pruefungen
                                     .Where(p => p.Note == 5)
                                     .Select(p => new
                {
                    p.Datum,
                    p.Fach,
                    p.Note
                })
            });

            Console.WriteLine("Beispiel 5");
            foreach (var schueler in result5)
            {
                Console.WriteLine($"   Negative Prüfungen von {schueler.Name} {schueler.Vorname}:");
                foreach (var pruef in schueler.NegativePruefungen)
                {
                    Console.WriteLine($"      {pruef.Fach} am {pruef.Datum.ToString("dd.MM.yyyy")}");
                }
            }

            // 6. Liefere eine Liste aller Prüfer mit ihren besten und schlechtesten
            //    Prüfungsergebnis. Gehe dabei so vor: Erzeuge mit Select und Distinct
            //    eine Stringliste aller Prüfer. Davon ausgehend erzeuge - wieder mit Select -
            //    ein neues Objekt mit den Properties Pruefer, BesteNote und SchlechtesteNote.
            //    BesteNote und SchlechtesteNote werden wieder von allen Prüfungen mit entsprechdem
            //    Where Filter berechnet.
            //    Später werden wir dieses Problem mit Group by lösen.

            var pruefers = db.Pruefungen.Select(p => p.Pruefer).Distinct();
            var result6  = pruefers
                           .Select(p => new
            {
                Pruefer          = p,
                BesteNote        = db.Pruefungen.Where(pr => pr.Pruefer == p).Min(pr => pr.Note),
                SchlechtesteNote = db.Pruefungen.Where(pr => pr.Pruefer == p).Max(pr => pr.Note),
            });

            Console.WriteLine("Beispiel 6");
            result6.ToList().ForEach(p => { Console.WriteLine($"   {p.Pruefer} gibt Noten von {p.BesteNote} bis {p.SchlechtesteNote}"); });
        }