2011-05-17 49 views
7

我們正在升級到NH3.1這進展順利 - 一切工作儘可能我們可以告訴現有的代碼。其中一個 從2轉移到NH3的動機一直是利用Linq 支持,並且通常它運行得非常好。不過我 一些更復雜的where子句,特別是當我 要基於一個子集檢查掙扎:NHibernate 3.1 Linq與包含和任何

var results = from r in registrations 
       where ( 
         from p in persons 
         where p.ExplicitManagers.Any(m => m.Manager == manager) 
         select p 
        ).Contains(r.Registrant) 
       select r; 

,其中型號爲:
pPersonregistrationrPerson
p的註冊人包含ExplicitManager關聯實體的集合,其中 持有對另一個Person(經理)的引用。

注意:註冊是IQueryable<Registration>.Query()和人 在IQueryable<Person>.Query()
本質上,我試圖限制註冊到person1p的顯式管理器。我可以通過連接完成此操作,但不能通過 ,Contains子查詢完成。

我收到以下錯誤:

"System.InvalidOperationException : Sequence contains more than one matching element"

做這個作爲一個子查詢的原因是因爲最終我需要 外部化邏輯檢查經理,使其可重複使用的 (它實際上是更復雜,但我已經簡化了這個例子 ,因爲它是在Contains內導致悲傷的Any)。

Contains似乎沒有任何子查詢時工作正常。 這是我做錯了什麼,或者它是不受支持的東西,或者是一個錯誤,還有另一種達到同樣目的的方式嗎?

非常感謝您的幫助。

回答

7

雖然Contains似乎沒有正常工作,使用Any作用:

var results = from r in registrations 
       where ( 
         from p in persons 
         where p.ExplicitManagers.Any(m => m.Manager == manager) 
         select p 
        ).Any(p=>p == r.Registrant) 
       select r; 
1

你可以自己執行子查詢嗎?

var result = from p in persons 
where p.ExplicitManagers.Any(m => m.Manager == manager) 
select p; 
+0

是工作正常。當Any出現在子查詢/'Contains'中時似乎只是一個問題 – IThasTheAnswer 2011-05-17 11:59:11

+1

順便說一下,我發現了以下工作:var results = from r in registrations where( from p in persons where where p.ExplicitManagers.Any( m => m.Manager == manager) select p ).Any(x => x == r.Registrant) select r;解決了我眼前的問題 – IThasTheAnswer 2011-05-17 20:02:26