我们正在升级到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;
模型是:
p
是Person
而registration
r
的注册人类型为Person
p
包含ExplicitManager
个关联实体的集合
持有对另一个Person
(经理)的引用。
注意:注册是IQueryable<Registration>.Query()
和人
在IQueryable<Person>.Query()
基本上我试图将注册限制在person1
的位置
是p
的明确管理者。我可以通过连接而不是通过连接来完成此操作
Contains
子查询。
我收到以下错误:
“System.InvalidOperationException: 序列包含多个 匹配元素“
这样做作为子查询的原因是因为我最终需要
外部化逻辑以检查管理器使其可重用
(它实际上更复杂,但我已经简化了这个例子
因为它是导致悲伤的Any
中的Contains
。
Contains
似乎工作正常。
这是我做错了什么,或者是不支持的事情
一个错误,是否有另一种方法来实现同样的事情?
非常感谢您提供的任何帮助。
答案 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;