【问题标题】:nHibernate Criteria for selecting a parent if a child in a collection has a specific value如果集合中的子项具有特定值,则 nHibernate 选择父项的标准
【发布时间】:2010-04-28 13:01:36
【问题描述】:

如果我有以下类结构,如果其中一个孩子具有特定名称,那么 NHibernate 选择父母的标准是什么?

 public class Child
 {
     public int Id { get; set; }
     public int Name { get; set; }
 }

 public class Parent
 {
     public int Id { get; set; }
     public IList<Child> Children { get; set; }
 }

【问题讨论】:

    标签: nhibernate criteria


    【解决方案1】:

    我只是为集合创建一个别名并添加限制。

    var parentsWithKidName = session.CreateCriteria<Parent>()
        .CreateAlias("Children", "c", JoinType.InnerJoin)
        .Add(Restrictions.Eq("c.Name", childName))
        .SetResultTransformer(Transformers.DistinctRootEntity()) 
        .List<Parent>();
    

    这会导致

    select p.* 
    from parent p 
    inner join child c on /* however it's mapped? */
    where c.Name = ?
    

    不同的根实体转换器将处理结果集并删除重复的父实体。不过,他们仍然会遇到麻烦。

    【讨论】:

      【解决方案2】:

      我所做的是为父类型创建条件查询,使用return为子类型创建条件查询,然后将特定条件添加到子类型子查询中。

      public virtual IList<T> GetByChildCriteria(string childName,
         params ICriterion[] criterion)
      {
           ICriteria criteria = NHibernateSession
           .CreateCriteria(persitentType)
           .CreateCriteria(childName);
           foreach (ICriterion criterium in criterion)
           {
               criteria.Add(criterium);
           }
           return criteria.List<T>();
      }
      

      注意:NHibernateSession 变量属于 ISession 类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-10
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        • 2021-04-12
        相关资源
        最近更新 更多