Skip to content

Commit 780496d

Browse files
committed
Revise L26
1 parent 044b1a4 commit 780496d

1 file changed

Lines changed: 75 additions & 47 deletions

File tree

26_LINQ.md

Lines changed: 75 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
author: Sebastian Zug, Galina Rudolf & André Dietrich
44
email: sebastian.zug@informatik.tu-freiberg.de
5-
version: 1.0.3
5+
version: 1.0.4
66
language: de
77
narrator: Deutsch Female
88
comment: Erweiterungsmethode, anonyme Typen, Enumerables, LINQ-Grundlagen und Basisfunktionen
@@ -34,6 +34,16 @@ import: https://raw.githubusercontent.com/TUBAF-IfI-LiaScript/VL_Softwareentwick
3434

3535
---------------------------------------------------------------------
3636

37+
## Diskussion der Evaluation
38+
39+
...
40+
41+
42+
## Prüfung Eingebettete Systeme
43+
44+
Prüfung und Terminabstimmung gern nach der Vorlesung.
45+
46+
3747
## Fragen aus den Projekten
3848

3949
> Frage: Was ist eigentlich eine csv Datei?
@@ -103,7 +113,7 @@ class ReadingCSV
103113
<Project Sdk="Microsoft.NET.Sdk">
104114
<PropertyGroup>
105115
<OutputType>Exe</OutputType>
106-
<TargetFramework>net6.0</TargetFramework>
116+
<TargetFramework>net8.0</TargetFramework>
107117
</PropertyGroup>
108118
</Project>
109119
```
@@ -230,6 +240,7 @@ using System.Collections.Generic;
230240

231241

232242
public class Character: IComparable{
243+
233244
protected string name;
234245
public int geburtsjahr;
235246
private static int Count;
@@ -263,6 +274,8 @@ public class Program
263274
Console.WriteLine($"\nEinträge in der Datenbank: {ComicHeros.Count}");
264275
Console.WriteLine("\nGefilterte Einträge in der Datenbank:");
265276
Console.WriteLine("| Index | Name | Ursprung |");
277+
278+
// Filterung der Einträge
266279
List<Character> ComicHerosFiltered = new List<Character>();
267280
foreach (Character c in ComicHeros){
268281
if (c.geburtsjahr < 1950) ComicHerosFiltered.Add(c);
@@ -514,7 +527,7 @@ FROM Vorlesung;
514527
```
515528
@AlaSQL.eval
516529

517-
Eine erste Form der Filterung kann nun darin bestehen, zunächst die Anzahl der überhaupt aktiven Studierenden zu bestimmen. Diese müssten in der Tabelle `hoert` eingetragen sein. `DISTINCT` implementiert die Auswahl von eindeutigen Werten.
530+
Eine erste Form der Filterung kann nun darin bestehen, zunächst die Anzahl der überhaupt aktiven Studierenden zu bestimmen. Diese müssten in der Tabelle `hoert` eingetragen sein. `DISTINCT` implementiert die Auswahl von eindeutigen Werten, Dublikate werden entfernt.
518531

519532
``` sql Abfrage mit eindeutigen Werten
520533
SELECT DISTINCT MatrNr
@@ -529,6 +542,7 @@ FROM hoert;
529542
SELECT VorlNr, Titel
530543
FROM Vorlesung
531544
WHERE Titel = 'ET';
545+
-- WHERE Titel LIKE '_T';
532546
```
533547
@AlaSQL.eval
534548

@@ -551,6 +565,8 @@ INNER JOIN Vorlesung ON Professor.PersNr = Vorlesung.PersNr;
551565
```
552566
@AlaSQL.eval
553567

568+
Die Abfrage liefert die Vorlesungsnummer, den Titel der Vorlesung sowie die Personalnummer und den Namen des Professors für alle Vorlesungen, die von einem Professor gehalten werden.
569+
554570
`GROUP BY` ermöglicht die Gruppierung von Zeilen, die ein gemeinsames Merkmal aufweisen. `COUNT` zählt die Anzahl der Zeilen, die in die Gruppe fallen.
555571

556572
``` sql Gruppierung mit Aggregat-Funktionen
@@ -563,6 +579,45 @@ GROUP BY Professor.Name, Professor.PersNr;
563579

564580
****************************************************************
565581

582+
### Übliche Umsetzung "von außen"
583+
584+
> Was bewirkt die folgende nicht-typisierte Umsetzung?
585+
586+
```python
587+
import sqlite3
588+
connection = sqlite3.connect("company.db")
589+
590+
cursor = connection.cursor()
591+
592+
# delete
593+
#cursor.execute("""DROP TABLE employee;""")
594+
595+
sql_command = """
596+
CREATE TABLE employee (
597+
staff_number INTEGER PRIMARY KEY,
598+
fname VARCHAR(20),
599+
lname VARCHAR(30),
600+
gender CHAR(1),
601+
joining DATE,
602+
birth_date DATE);"""
603+
604+
cursor.execute(sql_command)
605+
606+
sql_command = """INSERT INTO employee (staff_number, fname, lname, gender, birth_date)
607+
VALUES (NULL, "William", "Shakespeare", "m", "1564-04-??");"""
608+
cursor.execute(sql_command)
609+
610+
611+
sql_command = """INSERT INTO employee (staff_number, fname, lname, gender, birth_date)
612+
VALUES (NULL, "Friedrich", "Schiller", "m", "1759-11-10");"""
613+
cursor.execute(sql_command)
614+
615+
# never forget this, if you want the changes to be saved:
616+
connection.commit()
617+
618+
connection.close()
619+
```
620+
566621
## LINQ Umsetzung
567622

568623
*Language Integrated Query* (LINQ) zielt auf die direkte Integration von
@@ -662,6 +717,8 @@ class MyString
662717
// Erweiterungsmethode in einer separaten Klasse
663718
static class Exporter
664719
{
720+
// Wichtig! Das this vor dem ersten Parameter macht daraus eine Erweiterungsmethode
721+
// ----
665722
public static void print(this MyString input, string newString)
666723
{
667724
Console.WriteLine(input.content + newString);
@@ -902,6 +959,7 @@ class Program {
902959
IEnumerable<int> scoreQuery =
903960
from score in scores // Bezug zur Datenquelle
904961
where score > 80 // Filterkriterium
962+
//where score == "A" // nur zum Testen des Compilers:-)
905963
select score; // "Projektion" des Rückgabewertes
906964
// Execute the query.
907965
foreach (int i in scoreQuery)
@@ -932,15 +990,15 @@ Variante.
932990

933991
Insgesamt sind 7 Query-Klauseln vorimplementiert, können aber durch Erweiterungsmethoden ergänzt werden.
934992

935-
| Ausdruck | Bedeutung |
936-
| -------- | ------------------------------------------------- |
937-
| from | definieren der Laufvariable und einer Datenquelle |
938-
| where | filtert die Daten nach bestimten Kriterien |
939-
| orderby | sortiert die Elemente |
940-
| select | projeziert die Laufvariable auf die Ergebnisfolge |
941-
| group | bildet Gruppen innerhalb der Ergebnismenge |
942-
| join | vereinigt Elemente mehrerer Datenquellen |
943-
| let | definiert eine Hilfsvariable |
993+
| Ausdruck | Bedeutung |
994+
| --------- | ------------------------------------------------- |
995+
| `from` | definieren der Laufvariable und einer Datenquelle |
996+
| `where` | filtert die Daten nach bestimten Kriterien |
997+
| `orderby` | sortiert die Elemente |
998+
| `select` | projeziert die Laufvariable auf die Ergebnisfolge |
999+
| `group` | bildet Gruppen innerhalb der Ergebnismenge |
1000+
| `join` | vereinigt Elemente mehrerer Datenquellen |
1001+
| `let` | definiert eine Hilfsvariable |
9441002

9451003
```csharp
9461004
class Student{
@@ -978,40 +1036,6 @@ Iteration durch den Datentyp `List<Student>`.
9781036

9791037
Für nicht-generische Typen (die also `IEnumerable` anstatt `IEnumerable<T>` unmittelbar) implementieren, muss zusätzlich der Typ der Laufvariable angegeben werden, da diese nicht aus der Datenquelle ermittelt werden kann.
9801038

981-
```csharp StudentListExample
982-
using System;
983-
using System.Collections.Generic;
984-
using System.Linq;
985-
986-
public class Student
987-
{
988-
public string FirstName { get; set; }
989-
public string LastName { get; set; }
990-
public int[] Scores { get; set; }
991-
}
992-
993-
class Program {
994-
public static void Main(string[] args){
995-
//ArrayList StudentList = new ArrayList(); <-- Nicht mehr benutzen
996-
List<Student> StudentList = new List<Student>();
997-
StudentList.Add(
998-
new Student{
999-
FirstName = "Svetlana", LastName = "Müller", Scores = new int[] { 98, 92, 81, 60 }
1000-
});
1001-
StudentList.Add(
1002-
new Student {
1003-
FirstName = "Claire", LastName = "O’Donnell", Scores = new int[] { 75, 84, 91, 39 }
1004-
});
1005-
var query = from student in StudentList
1006-
where student.Scores[0] > 95
1007-
select student;
1008-
foreach (Student s in query)
1009-
Console.WriteLine(s.LastName + ": " + s.Scores[0]);
1010-
}
1011-
}
1012-
```
1013-
@LIA.eval(`["main.cs"]`, `mcs main.cs`, `mono main.exe`)
1014-
10151039
Welche Struktur ergibt sich dabei generell für eine LINQ-Abfrage? Ein Query
10161040
beginnt immer mit einer `from`-Klausel und endet mit einer `select` oder `group`-Klausel.
10171041

@@ -1275,13 +1299,17 @@ class Program {
12751299
Console.WriteLine(" {0}", student.Name);
12761300
}
12771301
}
1302+
12781303
var query2 = from s in students
12791304
group s by s.Subject into sg
12801305
select new {Subject = sg.Key, Count = sg.Count()};
1281-
Console.WriteLine();
1306+
12821307
foreach (var group in query2){
12831308
Console.WriteLine(group.Count + " students attend in " + group.Subject);
12841309
}
1310+
Console.WriteLine(query2.GetType().Name);
1311+
var firstElement = query2.Cast<object>().FirstOrDefault();
1312+
Console.WriteLine(firstElement.GetType().FullName);
12851313
}
12861314
}
12871315
```

0 commit comments

Comments
 (0)