Fluent Nhibernate inner join

Ik heb 3 tafels (Master, Imagen, Linea) waren:

Master
public virtual int Id { get; private set; }
public virtual Imagen imagen { get; set; }

Imagen
public virtual int Id { get; private set; }
public virtual Linea linea { get; set; }

Linea
public virtual int Id { get; private set; }
public virtual String Nombre { get; set; }

Ik heb een vraag als deze nodig:

SELECT * FROM dbo.Master 
INNER JOIN dbo.Imagen ON dbo.Master.imagen_id = dbo.Imagen.Id 
INNER JOIN dbo.Linea ON dbo.Imagen.linea_id = dbo.Linea.Id 
WHERE dbo.Linea_Id = 5

Maar ik weet niet hoe ik Fluent Nhibernate moet vertellen om deze query te maken met de automapper. Tot nu toe heb ik dit geprobeerd:

ICriteria c = session.CreateCriteria(typeof(Master))
  .CreateAlias("dbo.Imagen", "img", JoinType.InnerJoin)
  .Add(Restrictions.Eq("img.linea_id", id_linea));

return c.List();

Maar ik krijg deze foutmelding: kon de eigenschap niet oplossen: dbo of: ImageManager.Model.Entity.Master

Alle ideeën over hoe je een innerlijke join kunt doen? Bij voorbaat dank

3

2 antwoord

Om te beginnen zou ik de dbo van dbo.Imagen verwijderen. Met behulp van de ICriteria-interface moet u denken in termen van objecten, niet van databasetabellen, hoewel er een één-op-één toewijzing kan zijn van object naar tabel en eigenschappen naar kolommen.

EDIT:
another option would be to use the QueryOver Lambda syntax.

   var list = session.QueryOver()
                        .JoinQueryOver(master => master.imagen)
                        .Where(imagen => imagen.linea.Id == 5)
                        .List();
8
toegevoegd
Sorry daarvoor ... ik leer de syntaxis van QueryOver nog steeds zelf. Zal maken.
toegevoegd de auteur Nathan Fisher, de bron
vast. Ik heb dit getest. Het zou nu moeten werken.
toegevoegd de auteur Nathan Fisher, de bron
Bedankt, Alredy deed dat. Ik ben echt nieuw voor Fluent Nhibernate.
toegevoegd de auteur lloiacono, de bron
Ik heb dit geprobeerd, maar ik krijg de volgende foutmelding: "kon het eigendom niet oplossen: imagen.linea.Id of: ImageManager.Model.Entity.Master" Ik veranderde ook naar .Waarom (Master => Master.imagen.linea.Id == 5 ) maar ik krijg dezelfde foutmelding
toegevoegd de auteur lloiacono, de bron
het werkt !!!, heel erg bedankt. In ieder geval eindig ik met het gebruik van ICriteria omdat ik de afbeeldingen en lijnen met betrekking tot die master moest krijgen, daarom heb ik createalias toegevoegd voor imagen en hdd, als ik dat niet deed krijg ik een LazyLoadException wanneer ik toegang krijg tot beeld- of hdd-eigenschappen op mijn meesterobject.
toegevoegd de auteur lloiacono, de bron
hier is de code: ICriteria c = session.CreateCriteria (typeof (MasterHdd)) .CreateAlias ​​("imagen", "img", JoinType.InnerJoin) .CreateAlias ​​("hdd", "h", JoinType.InnerJoin) .CreateAlias ​​( "img.linea", "lin", JoinType.InnerJoin). Add (Restrictions.Eq ("lin.Id", id_linea)); return c.List ();
toegevoegd de auteur lloiacono, de bron

Ik kan niet uit je eerdere opmerkingen komen als je het al hebt opgelost, maar ik zou het proberen

ICriteria c = session.CreateCriteria(typeof(Master))

.CreateAlias("imagen", "img", JoinType.InnerJoin)
.CreateAlias("img.linea", "lin", JoinType.InnerJoin)
.Add(Restrictions.Eq("lin.Id", 5));

return c.List();

EDIT: Behuizing gewijzigd zoals hieronder aangegeven.

3
toegevoegd
Wat is de foutmelding die u ontvangt?
toegevoegd de auteur fluent, de bron
Goede plek. Behuizing veranderd in mijn antwoord.
toegevoegd de auteur fluent, de bron
Ik denk dat het enige probleem met dit antwoord het geval zal zijn van de objectreferenties. je hebt Imagen waar @lloiacono zijn objectreferentie allemaal in kleine letters heeft - imagen. Linea-referentie zal hetzelfde zijn. Dat is misschien de reden waarom het niet werkt.
toegevoegd de auteur Nathan Fisher, de bron
Kijk eens naar de zomer van nhibernate series van stephen bohlen, nu een paar jaar oud, maar de basis is er voor ICriteria en nhibernate in het algemeen. bekijk ook funnelweblog.com het is een open-source blogplatform op basis van vloeiend-nhibernate
toegevoegd de auteur Nathan Fisher, de bron
Heel erg bedankt, ik ben hier momenteel mee bezig. Het probleem is dat het niet werkt. Dit is de fout die ik krijg: "kon eigenschap niet oplossen: Imagen van: ImageManager.Model.Entity.Master" Im met behulp van Automapping om elke map onder de modelmap te mappen: .Maps (m => m.AutoMappings.Add (model))) in de modelmap heb ik een submap genaamd Entiteit en daar heb ik de entiteiten:
toegevoegd de auteur lloiacono, de bron
public class Master {public virtual int Id {get; privé set; } openbare virtuele Imagen imagen {get; vast te stellen; } openbare virtuele Hdd hdd {get; vast te stellen; } openbare virtuele reeks hash_master {get; vast te stellen; }}
toegevoegd de auteur lloiacono, de bron
public class Linea {public virtual int Id {get; privé set; } public virtual int ObjVersion {get; vast te stellen; } public virtual String Nombre {get; vast te stellen; } public virtual String Tabla {get; vast te stellen; } openbare virtuele String NombreCorto {get; vast te stellen; }} public class Imagen {public virtual int Id {get; privé set; } public virtual String PartNumber {get; vast te stellen; } public virtual String Version {get; vast te stellen; } openbare virtuele String Dus {krijg; vast te stellen; } public virtual String Revision {get; vast te stellen; } openbare virtuele Linea linea {krijg; vast te stellen; } public virtual String Nombre {get; vast te stellen; }}
toegevoegd de auteur lloiacono, de bron
Bedankt @ NathanFisher dat was inderdaad het probleem. Ik krijg de fout niet meer, kan je me een goede handleiding aanbevelen voor vloeiend, ik lees de wiki, maar ik kan niets vinden over I-criteria.
toegevoegd de auteur lloiacono, de bron