2011-05-17 29 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