Laden...

Forenbeiträge von mchrd Ingesamt 17 Beiträge

11.09.2019 - 12:05 Uhr

Hallo zusammen,

ich würde gerne eine Abfrage (m zu n Beziehung) mittels Entity Framework Core tätigen und das Ergebnis gerne nach einer Entität sortieren lassen welche ich mittels Include einbeziehe.

Im Bild seht ihr eine Beispielhafte Beziehung.

Mittels

var erg = _db.Gebäude.Include(x => x.GebäudeHatRäume).ThenInclude(x => x.Raum).ToList()

könnte ich jetzt eine Abfrage erstellen. Allerdings möchte ich, dass die Liste nach den Namen der Räume sortiert wird.

Wenn ich das .OrderBy(x => x....) verwende kann ich nur nach der ID oder dem Namen der Gebäude sortieren lassen.

Über Tipps wäre ich dankbar.

14.02.2019 - 23:39 Uhr

Hallo zusammen,

ich habe mal eine Frage zu der ich keine wirkliche Antwort gefunden haben. Folgendes Codebeispiel:

ICollection test = new List<string>();
ICollection<string> test2 = new List<string>();
List<string> test3 = new List<string>();
IEnumerable<string> test4 = new List<string>();
IEnumerable test5 = new List<string>();

In welchen Fällen verwendet man was bzw. welche Vorteile hat es, wenn man sich z. B. auf ein Interface einschränkt anstelle immer einer List zurückzugeben (wie bei test3). Habt ihr ggf. reale Beispiele wo man was verwendet? Gibt es Performancevorteile/Speichervorteile etc.?

Ich hoffe, dass ich rüber bringen konnte was ich meine.

Danke für eure Hilfe!

LG

09.02.2019 - 12:40 Uhr

Hab die Lösung gefunden: Einfach auf der ViewPage @using MyNamespace verwenden. Dann funktioniert es. Warum es im Tutorial so geht und bei mir nicht weiß ich dennoch nicht. Falls das jemand weiß, dann gerne her mit der Info 😃

08.02.2019 - 22:35 Uhr

Hallo zusammen,

ich bearbeite gerade ein Tutorial zum Thema RazorPages. Leider erhalte ich im Gegensatz zum Tutorial eine Fehlermeldung. Ich weiß wirklich nicht woran es liegen könnte und wäre über einen Tipp dankbar.

Die AccessModifier habe ich geprüft, aber daran sollte es nicht liegen.

Index.cshtml


@page
@model IndexModel
@{
}
<br />
<h2>Book List</h2>
<br />
<a asp-page="Create" class="btn btn-primary">Create New Book</a>

@if (Model.Books.Count() > 0)
{
    <form method="post">
<div>
    <br />
    <table class="table table-condensed table-hover">
        <tr><th>@Html.DisplayNameFor(m => m.Books.FirstOrDefault().ISBN)</th></tr>
        </table>"

</div>
</form>
}
else
{
    <p>No books found.</p>
}

Fehlermeldung:
_Severity Code Description Project File Line Suppression State
Error CS1061 'IndexModel' does not contain a definition for 'Books' and no accessible extension method 'Books' accepting a first argument of type 'IndexModel' could be found (are you missing a using directive or an assembly reference?) BookListRazor C:\BookListRazor\BookListRazor\Pages\BookList\Index.cshtml 10 Active

Severity Code Description Project File Line Suppression State
Error CS1061 'IndexModel' does not contain a definition for 'Books' and no accessible extension method 'Books' accepting a first argument of type 'IndexModel' could be found (are you missing a using directive or an assembly reference?) BookListRazor C:\BookListRazor\BookListRazor\Pages\BookList\Index.cshtml 16 Active_

Index.cshtml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;

namespace BookListRazor.Model.BookList
{
    public class IndexModel : PageModel
    {
        

        private ApplicationDbContext _db;

        public IndexModel(ApplicationDbContext db)
        {
            _db = db;
        }

        public IEnumerable<Book> Books { get; set; }
        public string SomeData { get; set; }

        public async void OnGet()
        {
            Books = await _db.Books.ToListAsync();
        }
    }
}

Folgendes ist installiert:
Microsoft.AspNetCore.App 2.1.1
Microsoft.AspNetCore.Razor.Design 2.1.2
Microsoft.EntityFrameworkCore.Sqlite 2.1.4
Microsoft.EntityFrameworkCore.Tools 2.1.4
Microsoft.NETCore.App 2.1.0

Über Tipps wäre ich dankbar!

Ich wünsche euch einen schönen Abend!

Der Folgende Abschnitt ist nicht mehr wichtig. Den Beitrag habe ich nochmal editiert, da ich einen Fehler schon lösen konnte. Wie weiß ich leider nicht, da immer noch die gleichen Pakete installiert sind. Das einzige was ich gemacht hatte, war das dotnet-sdk-2.2.103 runtergeladen und auf dem PC installiert. An den Installationen im Projekt habe ich nichts gemacht.

Ganz unabhängig von dieser Fehlermeldung habe ich leider noch folgende Fehlermeldungen:> Fehlermeldung:

_Severity Code Description Project File Line Suppression State
Error Package restore failed. Rolling back package changes for 'BookListRazor'.

Severity Code Description Project File Line Suppression State
Error NU1107 Version conflict detected for Microsoft.EntityFrameworkCore. Install/reference Microsoft.EntityFrameworkCore 2.2.1 directly to project BookListRazor to resolve this issue.
BookListRazor -> Microsoft.EntityFrameworkCore.Sqlite 2.2.1 -> Microsoft.EntityFrameworkCore.Sqlite.Core 2.2.1 -> Microsoft.EntityFrameworkCore.Relational 2.2.1 -> Microsoft.EntityFrameworkCore (≥ 2.2.1)
BookListRazor -> Microsoft.AspNetCore.App 2.1.1 -> Microsoft.EntityFrameworkCore (≥ 2.1.1 && < 2.2.0). BookListRazor C:\BookListRazor\BookListRazor\BookListRazor.csproj 1 _

Leider weiß ich nicht, wie ich das Problem lösen kann, jedoch muss ich zugeben, dass ich nicht mal wirklich die Fehlermeldung verstehe (nicht von der Sprache, sondern inhaltlich). Ich habe das Projekt mit Asp.net Core 2.1 erstellt (Target Framework ist auch 2.1).

07.02.2019 - 22:33 Uhr

Hi MrSparkle,

vielen Dank für die Hilfe! Ich hab es hinbekommen! Sorry, dass ich mich erst so spät zurück gemeldet habe, aber ich habe noch einiges selbst ausprobiert.

Insbesondere der Tipp sich das generierte SQL anzeigen zu lassen war super! Danke!

30.01.2019 - 16:54 Uhr

Hallo MrSparkle,

vielen Dank für deine Antwort! Ja leider habe ich mich nicht richtig ausgedrückt um das rüber zu bringen was ich meine. Ich habe daher nochmal ein neues Modell in EFC erstellt:

    public class Child //Kind
    {
        public int ChildId { get; set; }
        public string Childname { get; set; }
        public ICollection<ChildPeople> ChildPeoples { get; set; }
    }

    public class ChildPeople
    {
        public int ChildId { get; set; }
        public Child Child { get; set; }
        public int PersonId { get; set; }
        public Person Person { get; set; }
    }

    public class Person // Eltern/Person
    {
        public int PersonId { get; set; }
        public string Personname { get; set; }
        public ICollection<ChildPeople> ChildPeoples { get; set; }
        public ICollection<PersonDivision> PersonDivisions { get; set; }
    }

    public class PersonDivision
    {
        public int PersonId { get; set; }
        public Person Person { get; set; }
        public int DivisionId { get; set; }
        public Division Division { get; set; }
    }

    public class Division //Abteilung
    {
        public int DivisionId { get; set; }
        public string DivisionName { get; set; }
        public ICollection<PersonDivision> PersonDivisions { get; set; }
        public ICollection<DivisionProduct> DivisionProducts { get; set; }
    }

    public class DivisionProduct
    {
        public int DivisionId { get; set; }
        public Division Division { get; set; }
        public int ProductId { get; set; }
        public Product Product { get; set; }
    }

    public class Product // Produkte
    {
        public int ProductId { get; set; }
        public string Productname { get; set; }
        public ICollection<DivisionProduct> DivisionProducts { get; set; }
        public ICollection<ProductCategory> ProductCategories { get; set; }
    }

    public class ProductCategory
    {
        public int ProductId { get; set; }
        public Product Product { get; set; }
        public int CategoryId { get; set; }
        public Category Category { get; set; }
    }

    public class Category // (Produkt-)Kategorien
    {
        public int CategoryId { get; set; }
        public string CategoryName { get; set; }
        public ICollection<ProductCategory> ProductCategories { get; set; }
    }

Dieses Modell habe ich konstruiert (ohne dass es einen realen Zusammenhang gibt). Wichtig war mir, dass ich über einige m:n Beziehungen wandern muss.

Würde ich Include oder Extend verwenden um folgende Frage zu beantworten bzw. wie würde eine effiziente Abfrage in Methodenschreibweise aussehen?

Wer sind die Eltern von Kind 1, in welcher Abteilung arbeiten Sie, welche Produkte stellt diese Abteilung her und zu welcher Kategorie gehören diese?

Das Ergebnis würde ich als Tabelle ausgeben wollen (wenn es mehrere Eltern gibt, dann gäbe es zwei Zeilen).
Childname | Personname | DivisionName | Productname | CategoryName

Tut mir leid, dass ich das noch nicht wirklich verstanden habe wie man sinnvoll Abfragen erstellt (mittels Join in Abfragesyntax würde ich diese Abfrage hinbekommen) jedoch möchte ich auch verstehen wofür z. B. SelectMany, Include, Extend eingesetzt werden können.

Ich wünsche euch einen schönen Abend!

29.01.2019 - 17:07 Uhr

Hallo zusammen,

ich habe eine Frage zur Abfragesyntax und Methodensyntax in LINQ. Ich habe in der Datei mal eine fiktives Datenbankschema erstellt. Wenn ich dieses mittels Entity Framework Core umsetzen wollte könnte ich z. B. mittels LINQ abfragen erstellen.

Wenn ich folgende Abfrage erstellen möchte "Welche Bücher hat Author 1 und zu welchen Kategorien gehören die jeweiligen Bücher" würde ich eine solche Abfrage per Abfragesyntax in LINQ hinbekommen.

Allerdings würde ich die gleiche Abfrage gerne einmal mit der Methodensyntax realisieren. Hierzu habe ich folgende Frage:

Wenn ich die Abfrage in der Abfragensyntax erstelle Joine ich Tabellen. Ich habe jedoch Beispiele gesehen, bei denen mittels **Expand **(oData) oder **Include **Daten abgefragt werden.

Besteht die Möglichkeit, dass man** ohne ein Join über die Navigation Properties** eine Abfrage erstellt, welche zu einem Author die Bücher mit der jeweiligen Kategorie ausgibt ohne dass man sagen muss, welche Daten zu Joinen sind?

Ich hoffe ich habe meine Frage verständlich ausgedrückt. Wenn nicht würde ich Code erstellen.

Danke fürs Lesen und für die Hilfe vorab!

18.11.2018 - 21:12 Uhr

für eine GUI Applikation empfiehlt es sich immer auf das drei Schichten Architektur zu setzen.

Vor allem bei länger laufenden Operationen (=> Datei einlesen, verarbeiten, speichern), bietet sich Nebenläufigkeit, also async an

Guten Abend Papst,
vielen Dank für deine Antwort. Genau das versuche ich zu realisieren (in Schichten). Ich könnte ja in die Logik/Prüfung einfach in die

 private void btnEinlesen_Click(object sender, EventArgs e)

schreiben. Aber das kommt selbst mir als Anfänger relativ unsauber vor. Aber leider gibt es in diesem Beitrag keine Codebeispiele an denen "ich lernen könnte".

Das mit dem async ist eine gute Idee/guter Hinweis!

Als Abendlektüre
>
bzw. mein eigener Artikel zum Thema:
>
.

Alternativ (zu Events) könntest du aber auch in deiner Klasse CsvVerarbeiten eine eigene Exception werfen und diese dann in deiner Form-Klasse fangen und dort in der RichtTextBox den Fehler ausgeben.

Vielen Dank für deine Antwort! Hm ich weiß nicht ob es das trifft. Bei mir sind es ja keine zwei Forms sondern ein Objekt welches in die Form von der es aus aufgerufen wurde schreiben soll.

Leider komme ich mit den aktuellen Antworten mic nicht weiter. Ist da mein erster Beitrag vielleicht von mir zu schlecht erklärt, so dass man es falsch rüber kommt? Sollte ich es ggf nochmal besser erklären?

18.11.2018 - 17:44 Uhr

Hallo zusammen,

ich habe ein kleines Skript geschrieben welches eine CSV Datei einliest, bestimmte Operationen daran vornimmt und diese wieder abspeichert. Dies war ein Konsolenprogramm. Jetzt bin ich auf die Idee gekommen, es mal mit "Windows Forms" auszuprobieren. Was schon klappt ist z. B. das Auswählen des Pfads, das übergeben der Datei...

Allerdings war es bisher so, wenn es beim Einlesen zu einem Fehler gekommen ist, habe ich diesen direkt auf der Konsole ausgegeben (z. B. Zeile 3, Name fehlt).

Um die Fehlermeldungen ausgeben zu können, habe ich ein Richtextbox Namens "richTextBoxAusgabe" erstellt.

Es gibt ein Button, der das Einlesen startet. In der Datei "Form1.cs" habe ich u. A. folgenden Code stehen:

// Sobald man auf Öffnen klickt, bekommt man den OpenFileDialog geöffnet
private void btnEinlesen_Click(object sender, EventArgs e)
        {
            OpenFileDialog Ofd = new OpenFileDialog();
            Ofd.Filter = "csv Dateien|*.csv|txt Dateien (*.txt)|*.txt|Alle Dateien (*.*)|*.*";

            if (Ofd.ShowDialog() == DialogResult.OK)
            {
// Übergebe den Pfad der Datei)
// Die Klasse CsvVerarbeiten liest die CSV Datei ein und prüft ob alles ausgefüllt ist in den jeweiligen Zeilen
                CsvVerarbeiten csv = new CsvVerarbeiten (Ofd.FileName); 
            }
        }

Und genau hier habe ich die Frage. In der Klasse CsvVerarbeiten hatte ich bisher immer Console.WriteLine... stehen, wenn es zu einem Fehler kommt.

Wie kann ich innerhalb dieser Klasse bzw. dem Objekt csv auf die RichTextBox mit dem Namen richTextBoxAusgabe zugreifen um mittels Append und System.Environoment.NewLine immer die jeweilige Meldung ausgeben zu können.

In der Klasse "public partial class Form1 : Form" kann ich ohne Probleme mittels richTextBoxAusgabe.Text += "xzy"; zugreifen, jedoch ist diese Klasse nicht in meiner CsvVerarbeiten verfügbar.

**Es ist auch absolut okay, wenn ihr mir Schlagworte gebt, wie ich das hinbekommen kann oder ein anderes Beispiel nennt, nach dem ich mal suchen soll.

Danke für eure Hilfe und einen schönen Abend!**

18.11.2018 - 17:34 Uhr

Hallo zusammen,

zunächst einmal vielen Dank T-Virus für das Beispiel!

Allerdings musste ich aus "string[] lines"

string[] lines = File.ReadLines(filename);

foreach(string line in lines)
{
    // Leere Zeile überspringen
    if(String.IsNullOrEmpty(line))
        continue;

    // String in Teile zerlegen
    string[] data = line.Split(';');

ein "var lines" machen, dass es compiliert wurde. Also implizit die Variable lines deklarieren und den Compiler entscheiden lassen, welchen Typ die Variable hatte.

Anhand eurer Diskussionen merke ich, wie wenig Ahnung ich von C# habe und wie viel ihr könnt!

Danke nochmal an alle die hier so ausführlich erklären!

11.11.2018 - 08:08 Uhr

Guten Morgen Abt,
danke für deine Antwort.

LINQ ist nicht SQL.

Bei SQL Abfragen ....
Das sind zwei paar Stiefel, die erst mal nichts miteinander zutun haben.
Da solltest Du evtl. nochmal genauer lesen 😉

Ok, dann werde ich das tun. Wird aber sicher noch einige Zeit in Anspruch nehmen bis ich den Stand habe.

Kannst du mir noch einen Tipp geben, mit welcher Klasse ich die CSV Datei sonst einlesen kann? Da ich beim googlen i.d.R. immer nur Linq-Abfragen finde.
Linq liest Dir nicht Dein CSV ein. Auch bei Deinem Code nicht. Du kannst problemlos auf Linq in Deinem Code verzichten und trotzdem identisch Dein CSV einlesen. Und dass Du "nur Linq" in Zusammenhang mit CSV findest - bezweifle ich sehr stark.

Wenn ich es richtig verstanden habe, gehören die Funktionen Split(), Select(), Skip() zu LINQ. Dann ist es wirklich so, dass ich auf StackOverflow überall mindestes eine der Funktionen gefunden habe. Selbst wenn ich nach "C# read csv file without linq" eingebe, komme ich auf derarige Seiten mit linq Lösungen. Ich finde zwar auch so Ausdrücke wie:


var query = from line in File.ReadLines(filename)
    let csvLines = line.Split(';')
    from csvLine in csvLines
    where !String.IsNullOrWhiteSpace(csvLine)
    let data = csvLine.Split(',')
    select new
    {
        ID = data[0],
        FirstNumber = data[1],
        SecondNumber = data[2],
        ThirdNumber = data[3]
    };

Aber selbst hier ist ja das "Split" von LINQ oder verstehe ich das völlig falsch?

Vielleicht solltest Du auch noch mal lesen, was Linq ist 😉 Gerade Einsteiger tun sich oft schwer mit Linq; weil das Wissen fehlt, was Linq ist - und was nicht.
-> Linq ist nichts anderes als ein funktionaler Ansatz in .NET, um gewisse Schreibweisen zu vereinfachen.
Alles in Linq besteht aber im Endeffekt aus Schleifen und Bedingungen.

Ja wahrscheinlich habe ich da noch viel bedarf und muss noch einiges lernen um es wirklich zu verstehen.

Ein Einstieg dazu:
>

Aber wie gesagt; übersichtlicher oder schneller ist Linq nicht unbedingt; letzteres aber auch in dem Delta nicht relevant.[/csharp]
Danke für den super Link. Von der Basta Konferenz gibt es ja einige interessante Videos.

Danke für deine/eure Hilfe!

09.11.2018 - 17:00 Uhr

Hallo,

ich danke euch herzlich für eure Antworten! Diese haben mir wirklich geholfen.

@p!lle
Danke für den Link zu dem guten Artikel. Dass der Typ csvData Person ist wusste ich, da ich aus dem anonymen Typ new ein new Person

.Select(x => new Person()

gemacht hatte. Nur wollte ich es gerne in einer generischen Liste haben (List<Person>) haben. Der Artikel hat mir aber dennoch geholfen, da ich jetzt einige Dinge dazu gelernt habe.

Ich habe das mit dem zweiten Code durchgespielt und es hat wirklich funktioniert. Ich hatte einen anderen Fehler (dort hatte ich eine Datei verwendet, welche eine Spalte weniger hatte. Danke für den Hinweis!

@Spook
Stimmt das ist ein wirklich guter Einwand (wenn zwischen der positiven Prüfung und dem Aufruf die Datei doch noch von einem anderen Prozess blockiert wird).

Das File.ReadLines zu verwenden ist ein super Hinweis! Danke! Ich habe noch ein wenig nachgelesen und es macht absolut Sinn. Danke!

@Abt
Nein das stimmt Linq ist nicht unbedingt immer performant. Bei SQL Abfragen habe ich das bereits mehrfach gelesen, dass komplexe Abfragen nicht unbedingt derart optimiert sind, dass sie mit einer guten SQL Abfrage mithalten können.

Kannst du mir noch einen Tipp geben, mit welcher Klasse ich die CSV Datei sonst einlesen kann? Da ich beim googlen i.d.R. immer nur Linq-Abfragen finde.
Danke auch für deine Hilfe!

++
Ich wünsche euch allen einen schönen Abend++

08.11.2018 - 08:27 Uhr

Hallo zusammen,
ich möchte Daten aus einer Datei einlesen. Diese möchte ich gerne in eine Liste<Person> eintragen lassen. Hinbekommen habe ich es, jedoch stehe ich noch am Anfang was meine Erfahrung in C# angeht und ich denke, dass man das folgende Beispiel effizienter lösen kann:

Die Datei hat folgenden Aufbau:


Vorname; Nachname;
Daniel; Müller
...
Hans; Schneider
class Person
{
public string Vorname{ get; set; }
public string Nachname{ get; set; }
}
string path = @"C:\Daten.csv";

            var csvData = File.ReadAllLines(path)
                   .Skip(1)
                   .Select(x => x.Split(';'))
                   .Select(x => new Person()
                   {
                       Vorname = x[0],
                       Nachname = x[1]
                   });

            var Person= new List<Person>();

            foreach (var item in csvData)
            {
                Person.Add(new Person () {   
                                                                Vorname = item.Vorname,
                                                                Nachname = item.Nachname
                                                            });
            }

Ich hatte probiert an die LinQ Abfrage wie folgt zu erstellen:

List<Person> csvData  = File.ReadAllLines(path)
                   .Skip(1)
                   .Select(x => x.Split(';'))
                   .Select(x => new Person()
                   {
                       Vorname = x[0],
                       Nachname = x[1]
                   }).ToList();

Was leider nicht erfolgreich war (auch andere diverse Formen haben nicht funktioniert).

Was mache ich falsch? Wie bekomme ich die Daten sofort in die List vom Typ Person?

Noch eine andere Fragen:

  • Mir ist beim Ausführen aufgefallen, dass ich mal eine Fehlermeldung bekommen habe, dass auf die Datei nicht zugegriffen werden kann da diese von einem anderen Prozess verwendet wird (ich hatte die Datei geöffnet). Daher würde es vermutlich Sinn machen zu prüfen ob die Datei "zur Verfügung" steht. Was würde man noch prüfen, bevor man mit dem File.ReadAllLines auf die Datei zugreift?

Danke für eure Hilfe!

08.11.2018 - 08:16 Uhr

Hallo zusammen,

vielen vielen Dank für die tolle Erklärung! Ich denke ich persönlich werde Überladungen (wenn überhaupt) sehr selten benötigen.

Ich wünsche euch einen schönen Tag!

01.11.2018 - 20:24 Uhr

Hallo zusammen,

ich lerne zur Zeit C#. Jetzt habe ich auf dieser Microsoft-WebseiteSeite folgenden Satz zum tenär bedingten Operator gelesen:

Der bedingte Operator kann nicht überladen werden.

Was bedeutet dies?
Ich habe dann weitergeschaut um es selbst herauszufinden und bin auf den Microsoftseiten noch auf overloadable-operators und operator gekommen. Leider halfen mir beide Webseiten nicht.

Ich kenne überladen bisher nur als Begriff, dass man einer Methode etwas überlädt (also z. B. Werte mitgibt).

Könnt ihr mir ggf. ein Beispiel geben und erklären was man darunter verstehen soll?

Danke!

27.10.2018 - 17:42 Uhr

Fluent Interface bzw. Method Chaining.

Decorator Pattern

Vielen Dank für die schnelle Antwort! Jetzt bin ich auch fündig geworden, dank der richtigen Schlagworte von dir!

27.10.2018 - 17:20 Uhr

Hallo zusammen,

ich habe eine Verständnisfrage.


public class Beispiel
{
        public int AuthorId { get; set; }
        public string Vorname{ get; set; }
        public string Nachname{ get; set; }

        public void Testfunktion1()
        {
                Console.WriteLine("Testfunktion 1 wurde aufgerufen");
        }

        public void Testfunktion2()
        {
                Console.WriteLine("Testfunktion 2 wurde aufgerufen");
        }

        public void Testfunktion3()
        {
                Console.WriteLine("Testfunktion 3 wurde aufgerufen");
        }
}


var test = new Beispiel();
test.Testfunktion1(); // würde "Testfunktion 1 wurde aufgerufen" ausgeben.
test.Testfunktion3(); // würde "Testfunktion 3 wurde aufgerufen" ausgeben.

Der Punkt dient in diesem Fall dazu, auf Eigenschaften oder Funktionen eines Objektes zuzugreifen. Jetzt habe ich aber schon Beispiele gesehen, bei denen mehrere Funktionen aufgerufen werden und mit einem Punkt getrennt sind. Ich kann mir nicht vorstellen, was dort genau passiert?!? Könnt ihr mir ggf. den Hintergrund an einem einfachen Beispiel erklären?

Beispielhaft aufgefallen ist mir das beim Entity Framework Core (wenn man m:n Relationen abbilden möchte), dann würde man u. A. folgendes


modelBuilder.Entity<BookCategory>()
        .HasOne(bc => bc.Book)
        .WithMany(b => b.BookCategories)
        .HasForeignKey(bc => bc.BookId);

Quelle: https://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration

schreiben.

Was passiert hier? Es wird bei der Klasse "modelBuilder" die Funktion Entity<BookCategory>() aufgerufen. Dies scheint eine generische Funktion zu sein, da dort ein Typ "BookCategory" übergeben wird. Jedoch werden dann noch zwei weitere Funktionen mit einem Punkt aufgerufen. Die WithMany und HasForeignKey.

Wenn ich jetzt ein Ergebnis einer Funktion an eine andere übergeben lassen möchte und diese hinteinander etwas abarbeiten würde ich es so schachteln.


Console.WriteLine(FunktionA(FunktionB(FunktionC(3)))));

In diesem Fall würde der Funktion 3 eine 3 übergeben werden. Alle 3 Funktionen geben wieder ein Int zurück und führen irgendeine Berechnung durch. Dann würde das Ergebnis von FunktionC an FunktionB übergeben werden. Diese berechnet etwas und übergibt das Ergebnis an Funktion A. Auch diese macht etwas und das Ergebnis wird dann an Console.WriteLine übergeben welches das Ergebnis anzeigt.

Habt ihr ggf. Links für mich oder einen Fachbegriff,, so dass ich dies besser suchen und verstehen kann, was mit diesen vielen Punkten gemacht wird bzw. wie so eine Klasse mit Funktionen aufgebaut sein kann?

Danke für eure Hilfe!