NHibernate 3.1中的Linq与Contains和Any

8
我们正在升级到NH3.1,目前进展顺利 - 据我们所知,所有现有代码都可以正常工作。从2升级到NH3的动机之一是利用Linq支持,总体而言效果非常好。然而,在处理一些更复杂的where子句时,我遇到了困难,特别是当我想基于子集合进行检查时:
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; 

模型如下:
p 是一个 Person,并且 registration r 有一个类型为 Person 的注册人
p 包含一组 ExplicitManager 关联实体,其中持有对另一个 Person(经理)的引用。
注意:registrations 是一个 IQueryable<Registration>.Query(),persons 在一个 IQueryable<Person>.Query() 中。
实质上,我试图将注册限制在 person1p 的显式经理的地方。我可以通过联接来完成这个操作,但不能通过 Contains 子查询来完成。
我得到了以下错误:

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

之所以将这个操作作为子查询是因为最终需要将检查经理的逻辑外部化,使其可重复使用(实际上它更复杂,但我已经为此例子简化了它,因为 AnyContains 中导致麻烦)。
当没有 Any 子查询时,Contains 似乎工作得很好。我是做错了什么吗?还是说这是不支持的或者是一个 bug?是否有其他方法可以实现相同的功能?
非常感谢您能够提供的任何帮助。
2个回答

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

你能单独执行子查询而没有问题吗?

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

是的,那个可以正常工作。只有当“Any”出现在子查询/“Contains”中时才会出现问题。 - IThasTheAnswer
1
顺便说一下,我发现以下代码有效:var results = from r in registrations where ( from p in persons where p.ExplicitManagers.Any(m => m.Manager == manager) select p ).Any(x=>x == r.Registrant) select r; 这段代码解决了我的当前问题。 - IThasTheAnswer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接