2014-02-08 3 views
1

나는 nHibernate에 익숙하지 않고 쿼리 작성을 시도하고있다. 나는 그것을 올바르게하는 것처럼 보이지 않는다. 내 모델에는 "구성 요소"의 ICollection을 포함하는 "제품"이 있습니다. 문자 "G"로 시작하는 구성 요소 참조가있는 구성 요소가 포함 된 모든 제품을 찾아야합니다. 나는 이것을 시도했다 :nHibernate QueryOver and JoinQueryOver

var matching = session.QueryOver<Product>() 
    .JoinQueryOver<Component>(p => p.Components) 
    .Where(c => c.ComponentReference.StartsWith("G")).List(); 

그러나 나는 'Delegate System.Func >>가 1 개의 매개 변수를 취하지 않는다고 말하는 컴파일 오류가 발생한다.

은 내가 표현에 전달할 수 있습니다 JoinQueryOver에 과부하 >> 그래서 난은 ICollection이 IEnumerable을 구현하기 때문에 내 쿼리가 작동 것이라고 생각했을 것이다

있습니다.

.Cast 및 JoinAlias를 사용하여 다양한 방법으로 시도했지만 불필요하게 복잡해 보입니다.

어디서 잘못 알 수 있습니까?

미리 감사드립니다.

답변

0

이 경우 하위 쿼리를 사용하는 것이 좋습니다.

SELECT product 
FROM product 
WHERE productId IN (SELECT ProductId FROM Component WHERE ComponenentReferece LIKE 'G%') 

을 왜 하위 쿼리를 사용하는 대신 가입하기 : 그것은이 같은 것이

Product product = null; 
Component component = null; 

// the subselect, returning the Product.ID 
// only if the Component.ComponentReference is like G% 
var subQuery = QueryOver.Of<Component>(() => component) 
    .WhereRestrictionOn(() => component.ComponentReference) 
     .IsLike("G", MatchMode.Start) 
    .Select(c => c.Product.ID); 

// the root Product 
var query = session.QueryOver<Product>(() => product) 
    .WithSubquery 
    .WhereProperty(() => product.ID) 
    .In(subQuery); 

// and finally the list 
var list = query 
    .List<Product>(); 

결과 SQL처럼 보일 수 있을까? 이 경우 결합은 카 테 시안 산물이되기 때문입니다. 제품의 세트는 제품의 순수, 평면 세트가 발생합니다, G %의

하위 쿼리로 시작하는 모든 구성 요소를 곱한 것입니다 반환, 그래서 우리는 제대로 이상의 페이징 (.Take().Skip())

+0

감사에 사용할 수 있습니다 당신의 도움. 나는 내 아이디어를 사용하여 일할 수있게되었지만 당신의 도움으로 2 가지 오류가 있음을 깨달았습니다. var matching = session.QueryOver () .JoinQueryOver (p => p.Components) .Where (c => c.ComponentCode.IsLike ("G", MatchMode.Start)). List(); 반환 일치; 내 오류 : 1) 잘못된 수업을 사용했습니다! (손바닥) ProductComponent이며 구성 요소가 아닙니다. 제품에 구성 요소가 아닌 ProductComponents의 ICollection이 있습니다. 2) IsLike가 아닌 StartsWith가 답변을 읽으면 구성 요소에 제품 속성이 없다는 것을 알았습니다. 잘못된 클래스를 사용하고있었습니다. 고맙습니다 :-) – user3161050

+0

나는 당신이 당신의 방식대로 그것을 할 수 있음을 알고있었습니다;) 단지 힌트가 필요했습니다. 포기 하지마. NHibernate 멋진 도구입니다. 제발, 시간을 보내고이 장을주의 깊게 읽으십시오 : http://nhforge.org/doc/nh/en/index.html#queryqueryover, 많은 도움이 될 것입니다 ... –