2009-09-01 7 views
2

J'ai 2 entités produits et images. Toutes les images ne sont pas des images de produits, et les images sont une sous-classe d'un fichier ci-dessous sont mes entités. J'ai besoin de trouver toutes les images qui ne sont pas associées à un produit. Je suis nouveau à la recherche d'entités et j'ai essayé de nombreuses approches. Toutes les idées ou les liens seraient grandement appréciés.NHibernate Left Outer Join Sous-classe

public class File 
    { 
     #region Feilds 
     public virtual int Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual Enumerations.File.FileType Type { get; set; } 
     public virtual string Extension { get; set; } 
     public virtual string Path { get; set; } 
     public virtual DateTime DateCreated { get; set; } 
     public virtual DateTime DateModified { get; set; } 
     #endregion 
    } 

public class Image : File 
{ 
    #region Fields 
    public virtual string ImageName { get; set; } 
    public virtual string Description { get; set; } 
    public virtual bool Active { get; set; } 
    public virtual DateTime DateTaken { get; set; } 
    #endregion 
} 

public class Product 
{ 
    #region Properties 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual decimal Price { get; set; } 
    public virtual decimal Weight { get; set; } 
    public virtual bool IsDigital { get; set; } 
    public virtual DateTime DateCreated { get; set; } 
    public virtual IList<Category> ProductCategories { get; set; } 
    public virtual IList<ProductAttribute> ProductAttributes { get; set; } 
    public virtual IList<Image> ProductImages { get; set; } 
    #endregion 
} 

Répondre

4

Vous pouvez utiliser un citères énumérés existe pas ... sous_requête

IList<Image> images = session.CreateCriteria<Image>("img") 
     .Add(Expression.Not(Subqueries.Exists(DetachedCriteria.For<ProductImageLink>("pil") 
        .SetProjection(Projections.Constant(1)) 
        .Add(Expression.EqProperty("img.image_id", "pil.image_id"))))) 
     .List<Image>(); 

Où ProductImageLink est la table d'association.

devrait se traduire par une requête comme ...

select ... from image img where not exists(select 1 from productimagelink pil where img.image_id = pil.image_id); 
+0

Cela a fonctionné comme un charme dû factoriser un peu à: IList <> APP.File.Image images = session.createCriteria (typeof (APP .Image .Fichier), "img") .Add (Expression.Not (Sous-requêtes.Exists (DetachedCriteria.For) ("pi") .SetProjection (Projections.Constant (1)) . Add (Expression.EqProperty ("img.Id", "pi.Image"))))). Liste (); – J2D2

+1

Qu'est-ce qu'une bonne ressource/documentation pour les critères de NHibernate Fluent? – J2D2

+0

oh oui, j'ai oublié la liste à la fin. Je ne suis pas sûr de parler couramment, je suis juste un mois à hiberner régulièrement. Je pensais que Fluent consistait à surmonter les fichiers de mappage hbm.xml. – dotjoe