c# – NHibernate.QueryException:重复的关联路径
发布时间:2020-12-15 21:25:18 所属栏目:百科 来源:网络整理
导读:下面的代码片段描述了我想使用查询做什么,但它会因上述错误而爆炸. 建筑物和AttributeValues之间存在一对多的关系,我的目标是找到所有具有“大”的AttributeValue和“Blue”的AttributeValue的建筑物. var attributeValueAlias1 = new AttributeValue(); var
下面的代码片段描述了我想使用查询做什么,但它会因上述错误而爆炸.
建筑物和AttributeValues之间存在一对多的关系,我的目标是找到所有具有“大”的AttributeValue和“Blue”的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(别名)添加了成员??资格测试,因此不会发生Duplicate别名错误,但是只有一个连接,它会导致SQL where子句永远不会为true 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") (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |