c# - NHibernate.查询异常 : duplicate association path

标签 c# nhibernate criteria

下面的代码片段描述了我想使用查询做什么,但它因上述错误而爆炸。

建筑物和 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();

那里的帖子很少,但没有一个能解决所描述的问题 herehere .

我可以做到这一点,因此在添加别名之前使用 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/

相关文章:

java - 排除在 Hibernate 对象中加载特定属性

c# - 在 .net 中没有 flash 的情况下,uploadify flash 按钮在浏览器中不起作用

c# - ASCII 编码和元音变音和重音

c# - 测试 nHibernate 映射

database - 使用 NHibernate 事件监听器模拟 AFTER UPDATE ... FROM DELETED 触发器

sql-server - 大表(10,000,000 行)上的 Nhibernate 分页性能

grails - GORM急于按条件获取收藏

sql - 使用grails和gorm执行嵌套选择

c# - 为什么 FileShare.ReadWrite 在这种情况下不起作用?

c# - 从 Azure 辅助角色运行控制台 - 没有权限