0

条件を適用してコレクションを取得するときに、いくつかの問題に直面しています。

public class Ship  
{
    public virtual int Id { get; protected set; }
    public virtual string Name { get; set; }
    public virtual IList<Structure> Structures { get; set; }       

    public Ship()
    {            
        Structures = new List<Structure>();
    }

    public virtual void AddStructure(Structure structure)
    {
        Structures.Add(structure);
    }        
}

public class Structure
{       
    public virtual int StructureId { get; protected set; }
    public virtual string Name { get; set; }
    public virtual Ship Ship { get; set; }
    public virtual int Score { get; set; }
    public virtual IList<StructureGeometry> StructuresGeomtries { get; set; }       

    public Structure()
    {
        StructuresGeomtries = new List<StructureGeometry>();
    }       
}  

public class StructureGeometry
{
    public virtual int StructureGeomId { get; protected set; }
    public virtual string Name { get; set; }                
    public virtual Structure Structure { get; set; }        

    public StructureGeometry()
    {          
    }
}


public class StructureMap : ClassMap<Structure>
{
    public StructureMap()
    {
        Id(x => x.StructureId).GeneratedBy.Increment();
        Map(x => x.Name);
        Map(x => x.Score);
        References(x => x.Ship);

        HasMany(x => x.StructuresGeomtries)
           .Cascade.All()
           .Inverse();   
    }
}    

 DetachedCriteria query = DetachedCriteria.For(typeof(Structure), "structure");
 Disjunction juction = Restrictions.Disjunction();
 juction.Add(NHibernate.Criterion.Expression.Like("Score", 1));
 juction.Add(NHibernate.Criterion.Expression.Like("Score", 3));
 query.Add(juction);

 Disjunction structureGeometryjuction = Restrictions.Disjunction();
 structureGeometryjuction.Add(NHibernate.Criterion.Expression.Like("Name", "SGeom3"));

 DetachedCriteria structuGeomCriteria = DetachedCriteria.For(typeof(StructureGeometry));
 structuGeomCriteria.Add(structureGeometryjuction);
 structuGeomCriteria.SetProjection(Projections.ProjectionList().Add(Projections.Property("Name"), "StructGeomName"));
        query.CreateCriteria("structure.StructuresGeomtries", "structureGeometry")               
        .Add(Subqueries.Exists(structuGeomCriteria));

var structures = query.GetExecutableCriteria(session).List<Structure>();

structures[0].StructuresGeomtries関連付けに従って取得されます。私は DTO を作成していません。同じエンティティ (POCO) からデータを取得しています。

コレクション プロパティにフィルタまたは条件を適用できません。デフォルトでは、1 対多の関連付けに従ってすべてのジオメトリを選択して Nhibernate します。

したがって、基準に従ってルートの親をフェッチすることはできますが、コレクション プロパティに基準を適用することはできません。

ありがとう、

4

1 に答える 1

0

選択を反転する必要があります。クエリで行っていることは、基準に一致するジオメトリを持つ構造を選択することです。ただし、これは選択した構造のジオメトリを除外しません。

コレクションのフィルターを使用してこれを実現できますが、代わりに StructureGeometry でクエリを実行する方が簡単だと思います。

var geoms = session.CreateCriteria<StructureGeometry>()
              .Add(Expression.Like("Name", "SGeom3"))
          .CreateAlias("Structure", "structure")
          .Add(Expression.Like("structure.Score", 1) || 
                   Expression.Like("structure.Score", 3))
              .List();
于 2013-06-10T16:19:27.207 に答える