我有我的班级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?
由于
答案 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>();