2010-10-29 6 views
2

J'ai entités:chargement Lazy retourne des records égaux

public class Document : PersistentObjectBase 
{ 
    public virtual long? FolderId 
    { 
     get; 
     set; 
    } 
} 

<id name="Id" column="ID"> 
    <generator class="identity" /> 
</id> 

<version column="VERSION" name="Version" type="Int64" unsaved-value="undefined" /> 

<property name="FolderId" column="FOLDER" /> 

public class DocumentFolder : PersistentObjectBase 
{ 
    public virtual long? ParentFolderId 
    { 
     get; 
     set; 
    } 

    #region [Lazy subfolders] 

    protected virtual IList<DocumentFolder> NSubFolders 
    { 
     get; 
     set; 
    } 

    public virtual IList<DocumentFolder> SubFolders 
    { 
     get 
     { 
      return GetObjectWithInitializationCheck(NSubFolders); 
     } 
     set 
     { 
      NSubFolders = value; 
     } 
    } 

    #endregion 

    #region [Lazy Documents] 

    protected virtual IList<Document> NDocuments 
    { 
     get; 
     set; 
    } 

    public virtual IList<Document> Documents 
    { 
     get 
     { 
      return GetObjectWithInitializationCheck(NDocuments); 
     } 
     set 
     { 
      NDocuments = value; 
     } 
    } 

    #endregion 
} 

où:

protected static T GetObjectWithInitializationCheck<T>(T propertyValue) where T : class 
    { 
     if (ObjectInitialized(propertyValue)) 
     { 
      return propertyValue; 
     } 
     return null; 
    } 

<id name="Id" column="ID"> 
    <generator class="identity" /> 
</id> 

<version column="VERSION" name="Version" type="Int64" unsaved-value="undefined" /> 

<property name="ParentFolderId" column="PARENT_FOLDER_ID" /> 

<bag name="NSubFolders" lazy="true" cascade="delete"> 
    <key column="PARENT_FOLDER_ID" /> 
    <one-to-many class="DocumentFolder" /> 
</bag> 

<bag name="NDocuments" lazy="true"> 
    <key column="FOLDER" /> 
    <one-to-many class="Document" /> 
</bag> 

Bien que les critères de construction, je fais:

criteria.SetResultTransformer(new DistinctRootEntityResultTransformer()); 
criteria.CreateCriteria("NSubFolders", "subFolders", JoinType.LeftOuterJoin); 
criteria.CreateCriteria("NDocuments", "documents", JoinType.LeftOuterJoin); 

La méthode renvoie des dossiers avec des sous-dossiers et documents, mais il est possible de trouver le dossier ou des documents à plusieurs reprises dans les listes. Par exemple, je n'ai que 30 dossiers mais j'en ai environ 180 où il y a un dossier mare que 1 fois. Désolé pour mon pauvre anglais ...

Répondre

1

C'est probablement votre JoinType. Utilisez un autre type (par exemple, Select), LeftOuterJoin renvoie n lignes pour chaque relation 1: n.

+0

Par exemple .... –

+0

Utilisez simplement Select, n'utilisez aucun type de jointure – Falcon