1
我正在爲搜索表單編寫處理程序。正在搜索的對象有3個布爾標誌和若干個集合(如ISet
)Nhibernate 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子查詢和然後將這些全部合併爲現有標準的'和'。
我認爲這是正確的軌道上,但它不喜歡的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));我想嘗試重寫子查詢如何讓他們... –
'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);'似乎適用於子查詢。仍然編寫更多的測試來證明它完全按預期工作。 –