2011-09-19 69 views
1

我正在爲搜索表單編寫處理程序。正在搜索的對象有3個布爾標誌和若干個集合(如ISetNhibernate QueryOver Field1 = True OR(Collection contains ...)

這些相關之處在於標誌表示集合中各個成員的抽象分組。在這個具體情況下,收集代表縣,城市和非常廣泛的「地區」。布爾標誌用於作者指定實體IsOutOfState,IsStatewide和/或IsEverywhere(例如Internet)。

還有其他非地理集合(例如主題)。任何對此的限制都將與地理限制一起進行。

在搜索表單上,用戶可以檢查特定的感興趣的地理區域(特定的縣和/或城市和/或地區)以及擴大其搜索範圍以包括具有一個或多個額外布爾標誌集的項目(如果他們沒有選擇框,我們不會限制布爾字段)。

在SQL手工編寫這一點,我會做一些事情,如:

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?到目前爲止,我的東西得到了主題和其他和標準確定這樣的:

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); 
} 

但我想不通我怎麼會用Disjunction比較高達3個布爾變量和最多3子查詢和然後將這些全部合併爲現有標準的'和'。

回答

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.MethodCallExpressionN爲鍵入「System.Linq.Expressions的對象.BinaryExpression」。 第110行:主題topicAlias = null; Line 111:var join = query.JoinQueryOver (f => f.Topics) Line 112:.WithSubquery.Where(()=> topicAlias.Id.IsIn(TopicIDs));我想嘗試重寫子查詢如何讓他們... –

+0

'var TopicSubQuery = QueryOver.Of ().JoinQueryOver (p => p.Topics).WhereRestrictionOn(t => t.Id).InInG (TopicIDs)\t \t \t \t .Select(Projections.Property (p => p.Id)); \t \t \t \t query = query.WithSubquery.WhereProperty(p => p.Id).In(TopicSubQuery);'似乎適用於子查詢。仍然編寫更多的測試來證明它完全按預期工作。 –