dedlfix: LINQ-Anweisung

Beitrag lesen

Tach!

Enschuldige, ich habe es vergessen zu erwähnen, dass ich momentan mit LINQ to SQL arbeite.

Also, wenn du keinen ganz besonders guten Grund hast, bei LINQ to SQL (L2S) zu bleiben, würde ich dir empfehlen, auf das Entity Framework umzusteigen. Das wird wenigstens noch aktiv weiterentwickelt. Die Klassen, die L2S anlegt, sind vollgestopft mit Zeug, die mehr oder weniger für das Datenbank-Handling benötigt werden. Das EF erzeugt Klassen, die nur aus deinen Datenfeldern plus den Navigation Properties bestehen. Das ist nicht nur im Code sondern auch in der Anwendung übersichtlicher.

Das Beispiel habe ich gut nachvollziehen können. Wenn du sagst "Navigation Properties füllen, ebenfalls normalerweise vom ORM erledigt", heißt, dass der ORM bereits anhand der Verknüpfungen in beider Tabellen, die Beziehungen automatisch herstellet und die Daten bereitsstellt und man braucht nur diese durch Count zu zählen?

Genau das. L2S hat Äquivalente zu den Navigation Properties. Deine Data Class für A hat eine Eigenschaft Bs vom Typ EntitySet<B>. Das ist das, was in meinem Beispiel das A.Bs ist (nicht verwechseln mit Program.Bs). Das L2S-Diagramm zeigt diese Navigation Properties nicht in der Auflistung der Feldnamen an, aber sie sind da. Beim Klick auf die Beziehungspfeile kannst du in den Properties die Child und Parent Property sehen, und da stehen dann auch die Namen der Eigenschaften.

Wie/wann bei L2S konkret dieses EntitySet gefüllt wird, weiß ich nicht (mehr). Es kann sein, dass man da erst noch ein Load() aufrufen muss, bvor man darauf zugreifen kann, also erst A.Bs.Load(); dann erst A.Bs.Count(); Beim EF kann man sich zwischen Lazy Load und einem expliziten Include() entscheiden.

Sind AS und BS bei einer LINQ to SQL jeweils die Objekte einer Klasse/Tabllenklasse/Entity?

Program.As/Bs/Cs sind die Tabellen-Klassen, also die Klassen vom Typ Table<A> etc. A.Bs und B.Cs sind die EntitySet<B> und <C>, Verweise auf die Teilmengen in B und C zum jeweilgen Datensatz/Objekt in A beziehungsweise B.

Was ich in meinem Beispiel weggelassen habe, sind die Rück-Links. Eine Navigation Property erweitert die Klassen an beiden Enden um jeweils eine Eigenschaft. Je nach Typ der Beziehung (1:n, 1:1, m:n) ist das eine ICollection<> (EntitySet<> bei L2S) oder eine Referenz auf eine einfache Klasse. Also, in B gibt es noch eine Eigenschaft A vom Typ A und in C ein B.

In L2S kannst du dir das alles anschauen. Wenn du die .dbml aufklappst, sollte darin eine .designer.cs zu finden sein. Die Enthält Klassen für den DataContext und die Klassen für die Tabellen. Der Code ist wie gesagt sehr umfangreich, aber du solltest deine Datenfeld-Eigenschaften und die Verlinkungseigenschaften (Nav.Props) darin finden. (Visual Studio -> Edit -> Outlining -> Collapse to Definitions - macht den Code etwas übersichtlicher)

dedlfix.