2011-09-19 5 views
1

검색 양식 처리기를 쓰고 있습니다. 검색되는 개체에는 3 개의 부울 플래그와 여러 개의 컬렉션 (ISet 등)이 있습니다.Nhibernate QueryOver Field1 = True 또는 (컬렉션에 ... 포함)

이들은 플래그가 컬렉션의 개별 구성원의 추상 그룹을 나타내는 것과 관련이 있습니다. 이 특정 사례에서 컬렉션은 카운티, 도시 및 매우 광범위한 "지역"을 나타냅니다. 부울 플래그는 작성자가 엔티티 IsOutOfState, IsStatewide 및/또는 IsEverywhere (예 : 인터넷)를 지정하도록합니다.

다른 지리적 인 컬렉션 (예 : 주제)이 있습니다. 이에 대한 제한은 지리적 제한 사항과 함께 ""될 것입니다.

검색 양식에서 사용자는 특정 지역 (특정 카운티 및/또는 도시 및/또는 지역)을 선택 해제 할 수있을뿐만 아니라 추가 불리언 플래그가 설정된 항목을 포함하도록 검색을 확장 할 수 있습니다 (상자를 체크하지 않으면 우리는 부울 필드를 제한하지 않습니다).

SELECT ... FROM foo LEFT JOIN FooCounties fc ON foo.ID = fc.ID 
LEFT JOIN FooCities fct ON foo.ID = fct.ID ... 
INNER JOIN FooTopics ft ON foo.ID = ft.ID 
WHERE (fc.CountyID IN (1, 2, ...) OR fct.CityID IN (1, 3, 5, ...) OR foo.IsStatewide = 1) 
     AND ft.TopicID IN (1, 4, 7, ...) 

가 어떻게 QueryOver이 번역 할 수 있습니다 :

SQL에서 수동으로 작성, 내가 좋아하는 뭔가를 할 거라고?

var query = Session.QueryOver<foo>(); 

if (SelectedTopicIDs.Count > 0) { 
    var TopicSubQ = QueryOver.Of<foo>().JoinQueryOver<Topic>(t => t.Topics)... etc. 
    query = query.WithSubquery.WhereProperty(p => p.Id).In(TopicSubQ); 
} 

하지만 내가 3 bools에 3 개 하위 쿼리까지 최대 비교 Disjunction을 사용하는 방법을 알아낼 수 없습니다, 그리고 : 지금까지 나는 이런 식으로 OK 주제와 다른과 기준을 가지고 그 모든 것을 'and'로 기존 기준과 합치십시오.

답변

0
var query = session.QueryOver<foo>(); 
var or = new Disjunction().Add(Restrictions.Where<foo>(f => f.IsStatewide)); 

if (SelectedCountryIDs.Count > 0) 
{ 
    Country countryAlias = null; 
    var join = query.JoinAlias(f => f.Countries,() => countryAlias); 
    or.Add(() => countryAlias.Id.IsIn(SelectedTopicIDs)); 
} 

query.Where(or); 

if (SelectedTopicIDs.Count > 0) 
{ 
    Topic topicAlias = null; 
    var join = query.JoinQueryOver<Topic>(f => f.Topics) 
        .WithSubquery.Where(() => topicAlias.Id).In(SelectedTopicIDs)); 
} 
+0

나는이 올바른 궤도에 있다고 생각하지만, 그것은 query.JoinQueryOver을 좋아하지 않는다 : 'System.Linq.Expressions를 입력 할 유형'System.Linq.Expressions.MethodCallExpressionN '의 개체를 캐스팅 할 수 없습니다 .BinaryExpression '. 줄 110 : 주제 topicAlias ​​= null; 줄 111 : var join = query.JoinQueryOver (f => f.Topics) 줄 112 : .WithSubquery.Where (() => topicAlias.Id.IsIn (TopicIDs)); (오류는 라인 111에 있습니다.) 하위 쿼리를 어떻게 작성했는지 다시 정리해 보겠습니다 ... –

+0

'var TopicSubQuery = QueryOver.Of () .JoinQueryOver (p => p.Topics) .WhereRestrictionOn (t => t.Id) .IsInG (주제 ID) \t \t \t \t.Select (프로젝션. 속성 (p => p.Id)); \t \t \t \t query = query.WithSubquery.WhereProperty (p => p.Id) .In (TopicSubQuery);'하위 쿼리에서 작동하는 것 같습니다. 여전히 더 많은 테스트를 작성하여 예상대로 완벽하게 작동합니다. –