검색 양식 처리기를 쓰고 있습니다. 검색되는 개체에는 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'로 기존 기준과 합치십시오.
나는이 올바른 궤도에 있다고 생각하지만, 그것은 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에 있습니다.) 하위 쿼리를 어떻게 작성했는지 다시 정리해 보겠습니다 ... –
'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);'하위 쿼리에서 작동하는 것 같습니다. 여전히 더 많은 테스트를 작성하여 예상대로 완벽하게 작동합니다. –