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.

Related Posts

1 Comment

    Okoska 🙂

Comments are closed.