NHibernate使用ICriteria在列表中搜索

时间:2009-11-09 15:36:50

标签: c# nhibernate fluent-nhibernate

我有我的班级X:

public class ClassX
{
   public virtual IList<ClassY> ListY { get; set; }
   ...
}

我的ClassX映射(使用Fluent)

 ...
 HasMany<ClassX>(x => x.ListY )
        .Inverse()
        .Cascade.AllDeleteOrphan()
        .KeyColumns.Add("`IDX`");
 ...

我的Y班:

 public class ClassY
 {
     ...
     public virtual ClassZ Z{ get; set; }
     ...
 }

映射ClassY

 ...
 References(x => x.Z, "IDZ").Cascade.None();
 ...

现在,我想搜索ListY Z.ID = 2 ...

中的所有ClassX元素

我怎样才能使用ICriteria?

由于

3 个答案:

答案 0 :(得分:3)

有标准吗?

Session.CreateCriteria<ClassX>()    
   .CreateCriteria("ListY")
   .Add(Expression.Eq("Id", 2)
   .List<ClassX>();

请注意,您只能拥有一个CreateCriteria,yu可以使用别名来添加对其他属性的限制。

评论后更新:

哦,我的错误,我认为您可能需要使用HQL:

select x fron ClassX as x 
left join x.ListY listY
left join listY.Z z
where z.Id=2

因为我不确定这是否有效:

Session.CreateCriteria<ClassX>()    
       .CreateCriteria("ListY")
       .CreateAlias("Z", "z")
       .Add(Expression.Eq("z.Id", 2)
       .List<ClassX>();

答案 1 :(得分:1)

我认为其中任何一个都应该有效:

Session.CreateCriteria<ClassX>()    
       .CreateAlias("ListY", "y")
       .CreateAlias("y.Z", "z")
       .Add(Expression.Eq("z.Id", 2))
       .List<ClassX>();

Session.CreateCriteria<ClassX>()    
       .CreateAlias("ListY", "y")
       .Add(Expression.Eq("y.Z.Id", 2))
       .List<ClassX>();

答案 2 :(得分:1)

如果我们违反此标准搜索到步骤,这可能有助于您的理解。据我所知,这里有两种解决方案。第一个选项是为其他两个类创建ICriteria对象。它看起来像这样:

ICriteria classXCriteria = Session.CreateCriteria<Class>();
ICriteria classYCriteria = classXCriteria.CreateCriteria<classY>();
ICriteria classZCriteria = classYCriteria.CreateCriteria<classZ>();

classZCriteria.Add(Expression.Eq("Z", [id to search on goes here]));

IList<ClassX> results = classXCriteria.List<ClassX>();

使用别名的第二个选项:

ICriteria classXCriteria = Session.CreateCriteria<ClassX>();
classXCriteria.CreateAlias("ListY", "classY");
classXCriteria.CreateAlias("classY.Z", "classZ");
classXCriteria.Add(Expression.Eq("classZ.Id", [id to search on goes here]));

IList<ClassX> results = classXCriteria.List<ClassX>();