2012-07-08 3 views
2

나는 NHibernate와 함께 asp.net mvc 응용 프로그램을 가지고 있으며 일부 데이터를 쿼리하는 문제를 해결하는 방법을 모르겠습니다. 나는이 쿼리를 실행하려고하면속성 (복잡한 속성)을 해결할 수 없습니다.

// create query 
var query = session.QueryOVer<Laudo>().Fetch(x => x.Equipament).Eager; 

// add some filters 
if (idEquipament.HasValue) 
    query = query.And(x => x.Equipament.Id == idEquipament.Value); 

//I got the error here... 
if (idCompany.HasValue) 
    query = query.And(x => x.Equipament.Company.Id == idCompany.Value); 

, 나는이 메시지와 함께 예외를 가지고 : "Equipament.Company.Id의 : 재산 확인할 수 없습니다 DomainModel.Laudo"나는이 쿼리를

이 문제를 해결하려면 어떻게해야합니까? 감사합니다.

답변

2

이와 같은 다른 엔티티 속성을 사용할 수 없습니다. Hibernate는 현재 엔티티의 프라퍼티로 평가 될 수있는 표현식을 기대한다. 다른 엔터티에 참여하려면 JoinQueryOver 또는 JoinAlias을 사용해야하며 이후에는 where을 수행해야합니다. JoinQueryOver

:

// ... 
query = query.JoinQueryOver(x => x.Equipment) 
    .JoinQueryOver(x => x.Company) 
    .Where(c => c.Id == idCompany.Value); 

JoinAlias으로 :

Equipment equipment = null; 
Company company = null; 

// ... 
query = query.JoinAlias(x => x.Equipment,() => equipment) 
    .JoinAlias(() => equipment.Company,() => company) 
    .Where(() => company.Id == idCompany.Value); 

일부 추가 정보를 원하시면 :
What is the difference between JoinQueryOver and JoinAlias?
What can be used as a NHibernate QueryOver alias?
Complex nHibernate QueryOver expression

+0

감사를 awser 사람을 위해. JoinAlias를 사용하여 문제를 해결합니다. –

+0

한 가지 질문 만 있으면이 조인의 일부 속성 만 채울 수있는 방법이 있습니까? 회사 엔티티에는 20 개 이상의 필드가 있으며 그 중 2 개 (ID 및 이름)가 필요합니다. 그렇게 할 방법이 있습니까? 감사합니다 –

+0

투영? http://www.nhforge.org/doc/nh/en/index.html#queryqueryover-projections –

1

귀하의 질문에 대해 선택한 태그를 사용하면 QueryOver가 아니라 LINQ를 사용하고 싶다고 생각합니다.

NHibernate.Linq 네임 스페이스에서 확장 메서드 Query을 사용하여 달성된다

var query = session.Query<Laudo>().Fetch(x => x.Equipament); 
if (idEquipament.HasValue) 
    query = query.Where(x => x.Equipament.Id == idEquipament.Value); 
if (idCompany.HasValue) 
    query = query.Where(x => x.Equipament.Company.Id == idCompany.Value); 
+0

안녕하세요 @ 디 에고, 좋은 팁,하지만 그것은 AND 연산자를 사용하여 AND 연산자를 생성합니다. 매개 변수 (나는 원래의 메서드에서 더 많은 매개 변수를가집니다)'idEquipament =? Equipament.Company_Id =?'... 당신이 말했듯이, 이점이 있습니까 아니면 똑같을까요? 고맙습니다! –

+0

정확히 동일합니다. –

관련 문제