我们正在升级到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
(经理)的引用。
注意:注册是一种IQueryable<Registration>.Query()
和人员在IQueryable<Person>.Query()
.
从本质上讲,我试图将注册限制在person1
是p
的显式管理器。我可以通过联接来做到这一点,但不能通过Contains
子查询。
我收到以下错误:
将其"System.InvalidOperationException : 序列包含多个 匹配元素"
作为子查询这样做的原因是因为最终我需要外部化用于检查管理器的逻辑以使其可重用(它实际上更复杂,但我为这个例子简化了它因为引起悲伤的是Contains
内的Any
)。
当没有与 Any 进行子查询时,Contains
似乎工作正常。这是我做错了什么,还是不支持或一个错误,有没有另一种方法可以实现同样的事情?
非常感谢您能提供的任何帮助。
虽然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;
你能毫无问题地自行执行子查询吗?
var result = from p in persons
where p.ExplicitManagers.Any(m => m.Manager == manager)
select p;