1

我希望由來自另一個對象的屬性過濾從DB對象,但我得到一個異常:如何限制在(流利)nhibernate中的QueryOver的選擇?

型「System.Collections.Generic.KeyNotFoundException」的第一次機會異常出現在mscorlib.dll
類型的第一次機會異常「NHibernate.QueryException」發生在NHibernate.dll
類型的第一次機會異常「NHibernate.QueryException」發生在NHibernate.dll
程序「[5116] Examples.FirstProject.vshost。 exe:Managed(v2.0.50727)'退出代碼-532459699(0xe0434f4d)。

這工作:

var curves = session.QueryOver<Curve>().WhereRestrictionOn(p => p.Name).IsLike("%CurveName%").List(); 
foreach (Curve curve in curves) 
{ 
    Console.WriteLine(" ID:\t{0}\n Name:\t{1}\n Group:\t{2}\n", curve.Id, curve.Name, curve.Group.Name); 
} 

這不,它輸出異常信息:

var curves = session.QueryOver<Curve>().WhereRestrictionOn(p => p.Group.Name).IsLike("%GroupName%").List(); 
foreach (Curve curve in curves) 
{ 
    Console.WriteLine(" ID:\t{0}\n Name:\t{1}\n Group:\t{2}\n", curve.Id, curve.Name, curve.Group.Name); 
} 

這是我的映射:

public class CurveMap : ClassMap<Curve> 
{ 
    public CurveMap() 
    { 
     Table("CURVES"); 
     Id(x => x.Id).Column("CURVE_ID"); 
     Map(x => x.Name).Column("NAME"); 
     References(x => x.Group).Column("GROUP_ID"); 
    } 
} 

public class CurveGroupMap : ClassMap<CurveGroup> 
{ 
    public CurveGroupMap() 
    { 
     Table("GROUPS"); 
     Id(x => x.Id).Column("GROUP_ID"); 
     Map(x => x.Name).Column("NAME"); 
     HasMany(x => x.Curves).KeyColumn("GROUP_ID").Cascade.All().Inverse(); 
    } 
} 

這些都是我的對象

public class Curve 
{ 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual CurveGroup Group { get; set; } 
} 

public class CurveGroup 
{ 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Curve> Curves { get; set; } 
} 

任何想法,如何解決這個問題。我很新(流利)nhibernate。

回答

2

如果你加入CurveGroup和使用別名它會工作:

CurveGroup cgAlias = null; 
var curves = session.QueryOver<Curve>() 
    .JoinAlias(e => e.Group,() => cgAlias) 
    .WhereRestrictionOn(() => cgAlias.Name).IsLike("%GroupName%").List(); 
+0

工作,但似乎令人費解。有沒有更簡單的方法來實現這個目標,或者爲什麼要這樣做。你能否詳細說明你的答案並提供更多細節。 – mrt181 2011-04-11 09:50:56

+1

@ mrt181似乎按照設計,QueryOver不會自行導航關聯路徑。您必須在查詢中明確指定。如果沒有指定關聯路徑,則拋出異常「無法解析屬性」。 (參見[這裏](http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx#Associations)瞭解更多'JoinAlias'和'JoinQueryOver的細節'。 – 2011-04-11 10:04:47

+0

謝謝,很高興知道 – mrt181 2011-04-11 10:47:45