1..* és *..* asszociáció lekérdezése egy függvény segítségével
1..* és *..* asszociáció lekérdezése egy függvény segítségével
Nem volt egyszerű szülés, őszintén mondom. Nagyjából a harmincadik megoldás lett a nyerő.
Mit is akartam?
C# és NHibernate segítségével egy olyan eljárást írni, ami 1..* kapcsolat esetén is, és *..* kapcsolat esetén is le tudja kérdezni a mester azonosítója alapján a hozzá tartozó értékeket.
Egy egyszerű példán keresztül szemléltetem.
Létezik egy iskola, ahol vannak tanárok, vannak osztályok, és vannak tantárgyak. Minket a tanárok érdekelnek, illetve az osztályok.
Szükségünk lenne arra, hogy egy – egy tanár melyik osztályban tanít, illetve visszafele is szükség lenne arra, hogy adott osztályba melyik tanárok tanítanak. És arra is szükségünk van, hogy egy – egy tanár milyen tantárgyakat tanít.
A tanár és az osztály között *..* azaz ManyToMany kapcsolat van, hiszen egy tanár több osztályban is taníthat, és egy osztályban több tanár is taníthat. A tanár és a tantárgy között 1..* azaz OneToMany, azaz egy tanárnak több tantárgya is lehet.
A megoldás viszonylag egyszerű, csak kellett hozzá jó pár napnyi dokumentáció böngészés:
return session.CreateCriteria("Classes", "a") .CreateCriteria("Teacher", "b", NHibernate.SqlCommand.JoinType.LeftOuterJoin) .Add(Restrictions.Eq("b.Id", 5)).List();A fenti kódrészlet lehozza az 5 -ös azonosítójú osztályhoz tartozó tanárok listáját.
return session.CreateCriteria("Teachers", "a") .CreateCriteria("Class", "b", NHibernate.SqlCommand.JoinType.LeftOuterJoin) .Add(Restrictions.Eq("b.Id", 12)).List();Ez a kódrészlet lehozza azokat a termeket, ahol a 12 -es azonosítójú tanár tanít.
return session.CreateCriteria("Teacher", "a") .CreateCriteria("Subject", "b", NHibernate.SqlCommand.JoinType.LeftOuterJoin) .Add(Restrictions.Eq("b.Id", 12)).List();És végezetül a 12 -es azonosítójú tanár összes tantárgyát tölti le az eljárás.
Mint látszik, a *..* és az 1..* kapcsolatban csak annyi a különbség, hogy a *..* kapcsolatnál a master adatokat többesszámmal láttam el.
Okoska 🙂