2017-03-13 8 views
0

에 액세스하려면이 지금 내가하는 A 객체의 B 객체의 C 클래스의 최대 (ID)를 얻으려면 내 모델NHibernate에 Queryover, 어떻게 중첩 proeprty

public class A{ 
    public int Id {get; set;} 
    public ICollection<B> bs {get; set;} 
} 

public class B{ 
    public int Id {get; set;} 
    public ICollection<C> cs {get; set;} 
} 

public class C{ 
    public int Id {get; set;} 
} 

입니다 :

public int GetMaxId(int idA, int idB) 

나는 어떤 diffente 방법을 시도해보십시오

var max= _session.QueryOver<A>().Select(a => a.Bs) 
.Where(a => a.Id == idA).SingleOrDefault<ICollection<B>>() 
.Where(b => b.Id == idB).FirstOrDefault<B>().Cs.Max(c => c.Id); 

var max = _session.QueryOver<A>().Where(a => a.Id == idA).Select(a => a.Bs.Where(b => b.Id == idB)).Future<B>().Max(c => c.Id); 

아무 것도 작동하지 않습니다.

이 작업을 수행하는 방법은 무엇입니까? 감사합니다

답변

2

우선 SingleOrDefaultFirstOrDefault는 귀하의 질의를 끝내십시오. 이후에 오는 모든 것은 데이터베이스가 아닌 메모리에서 처리됩니다! 그 외에, 당신은 NullReferenceException의 기회가이 방법 후에있다.

QueryOver API에서 중첩 된 속성을 사용하려면 별칭을 사용해야합니다. '별칭'제목 아래에 here으로 표시됩니다.

하지만 내 생각에 가장 간단한 방법은 대신 LINQ를 사용 :

_session.Query<A>() 
    .Where(a => a.Id == idA) 
    .SelectMany(a => a.Bs) 
    .Where(b => b.Id == idB) 
    .SelectMany(b => b.Cs) 
    .Max(c => (int?)c.Id) // the cast makes sure you don't get a null reference (tnx to gt.guybrush) 
+0

있는 방법이 쿼리에 직접 널 exeption를 관리하기 위해? –

+0

LINQ 예제에서 null이 발생할 가능성은 없습니다. 아니면 다른 쿼리를 의미합니까? – Pidon

+0

내 단위 테스트에서 일부 문제는 미안 해요, 그것을 시도 : D –