NHibernate 3.1 Linq with Contains and Any

时间:2011-05-17 10:08:16

标签: linq nhibernate

我们正在升级到NH3.1,进展顺利 - 就现有代码而言,一切正常。之一 从2开始转向NH3的动机一直是利用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; 

模型是:
pPersonregistration r的注册人类型为Person p包含ExplicitManager个关联实体的集合 持有对另一个Person(经理)的引用。

注意:注册是IQueryable<Registration>.Query()和人 在IQueryable<Person>.Query() 基本上我试图将注册限制在person1的位置 是p的明确管理者。我可以通过连接而不是通过连接来完成此操作 Contains子查询。

我收到以下错误:

  

“System.InvalidOperationException:   序列包含多个   匹配元素“

这样做作为子查询的原因是因为我最终需要 外部化逻辑以检查管理器使其可重用 (它实际上更复杂,但我已经简化了这个例子 因为它是导致悲伤的Any中的Contains

如果没有Any的子查询,

Contains似乎工作正常。 这是我做错了什么,或者是不支持的事情 一个错误,是否有另一种方法来实现同样的事情?

非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:8)

虽然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 :(得分:1)

你可以自己执行子查询吗?

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