2009-11-09 72 views
0

列表我有我的X類:NHibernate的搜索中使用的ICriteria

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

我ClassX映射(使用流利)

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

我的Y艙:

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

映射優雅

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

現在,我想搜索ListY中所有的ClassX元素Z.ID = 2 ...

我該如何使用ICriteria來做到這一點?

謝謝

回答

3

有符合?

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

要知道,你只能有一個個createCriteria,鬱可使用別名在其他屬性添加限制。您的評論後

更新:

噢,我的錯誤,我想你可能需要使用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>(); 
+0

但我的「ListY」有「ClassZ」元素中......而那些「Z」的元素應該在表達,對嗎? – Paul 2009-11-09 16:01:59

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>(); 
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>();