下面的代码片段描述了我想使用查询做什么,但它因上述错误而爆炸。
建筑物和 AttributeValues 之间存在一对多的关系,我的目标是找到所有 AttributeValue
为 "Large"
和 AttributeValue 的建筑物
“蓝色”
。
var attributeValueAlias1 = new AttributeValue();
var attributeValueAlias2 = new AttributeValue();
var result = repository
.CreateCriteriaFor<Buildings>()
.Join(o=>o.AttributeValues, ()=> attributeValueAlias1)
.Join(o=>o.AttributeValues, ()=> attributeValueAlias2)
.Add(() => attributeValueAlias1.Value == "Large")
.Add(() => attributeValueAlias2.Value == "Blue")
.List();
那里的帖子很少,但没有一个能解决所描述的问题 here和 here .
我可以做到这一点,因此在添加别名之前使用 criteria.GetCriteriaByAlias(alias)
添加成员资格测试,这样就不会发生重复别名错误,但是只有一个连接,结果是在永远不会为真的 SQL where 子句中
SELECT *
FROM Buildings this_
inner join AttributeValues attributev1_
on this_.Id = attributev1_.BuildingId
WHERE
attributev1_.Value = 'Large'
and attributev1_.Value = 'Blue'
这不是一个复杂或不寻常的查询,所以如果没有变通办法,我会感到惊讶。
最佳答案
您不应该使用联接来执行此操作,正如您可能从异常中猜到的那样。您应该使用两个子查询来测试值“Blue”和“Large”是否在集合中。我不擅长 ICriteria,但生成的 SQL 应该是这样的,我认为这在 ICriteria 中是可能的(使用 Subqueries.PropertyIn
)。
select * from Buildings b
inner join AttributeValues av on b.Id = av.BuildingId
where av.Id in (select Id from AttributeValues av2 where av2.BuildingId=b.BuildingId and av2.Value="Large")
and av.Id in (select Id from AttributeValues av3 where av3.BuildingId=b.BuildingId and av3.Value="Blue")
关于c# - NHibernate.查询异常 : duplicate association path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7981027/