2010-01-28 4 views
1

B라는 IList가 Bs이고 B가 Cs라는 IList를 가지고있다.LINQ to NHibernate는 아이들의 아이들에게 접근 할 수 없다.

5 개 이상의 C가있는 A를 모두 검색하고 싶습니다. 그래서 내가 가서 그러나 코드를 실행 (및 범위 변수에 지정된 최소를 가진) 나는 다음과 같은 예외가 얻을에

using (var s = this._sessionFactory.OpenSession()) 
{ 
    IQueryable<A> q = s.Linq<A>(); 
    // some code... 
    if (range.Min.HasValue)      
     q = q.Where(a => a.Bs.Sum(b => b.Cs.Count) >= range.Min.Value); 
    // some code... 
    return q.Select(b=>b).ToArray(); 
} 

을 썼다 :

NHibernate.QueryException : CS의 : 속성을 확인할 수 없습니다를

왜 A에서 B의 속성을 찾습니까?

A의 (유창함) 매핑 말한다 :

//... 
HasMany(a => a.Bs) 
.Table("Bs") 
.KeyColumn("IdA") 
.Cascade.AllDeleteOrphan() 
.Inverse() 
.Not.LazyLoad(); 
//... 

와 B에 매핑에

는 말한다 : C에 매핑에 마지막으로

//... 
HasMany(b => b.Cs) 
.Table("Cs") 
.KeyColumn("IdB") 
.Cascade.AllDeleteOrphan() 
.Inverse() 
.Not.LazyLoad(); 
References(b => b.A, "IdA") 
.Not.LazyLoad(); 
//... 

매핑은 그래도 잘 될 것 같다 :

References(c => c.B, "IdB").Not.LazyLoad(); 
+3

에 LINQ와 함께 할 수 없습니다. NHContrib Linq 공급자는 기능이 제한되어 있습니다. –

+0

NHibernate 트렁크에서 최신 LINQ 공급자가 있고 내 문제가 해결되지 않습니다. (((( –

답변

1

당신은 NHibernate에 2.x에서 당신은 NHibernate에 트렁크에서 최신의 LINQ 공급자를 시도 할 수 있습니다

1

LINQ to NHibernate는 간단한 쿼리를 쉽게 작성하는 데 적합합니다. 그러나 복잡한 쿼리 (예 : 이와 같은 쿼리)를 수행해야 할 경우 API 또는 HQL 기준으로 전환하는 것이 좋습니다. 3 가지 쿼리 방법을 자유롭게 사용할 수 있습니다.

일단 NHibernate 3.0이 릴리스되면 LINQ를 사용하여이 쿼리를 수행 할 수 있습니다.

+0

그래서 NHibernate에 대한 최신 릴리스 된 LINQ 공급자가 아직 이해가 안됨). –