下面的代码片段描述了我想要使用查询做什么,但它会因上述错误而爆炸。
建筑物和AttributeValues之间存在一对多的关系,我的目的是找到所有AttributeValue
"Large"
和AttributeValue
"Blue"
的建筑物。
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();
我可以这样做,所以在添加别名之前使用criteria.GetCriteriaByAlias(alias)
添加了成员资格测试,因此不会发生Duplicate别名错误,但是只有一个连接,它会导致SQL where子句永远不会是真的
SELECT *
FROM Buildings this_
inner join AttributeValues attributev1_
on this_.Id = attributev1_.BuildingId
WHERE
attributev1_.Value = 'Large'
and attributev1_.Value = 'Blue'
这不是一个复杂或不寻常的查询,所以如果没有解决方法,我会感到惊讶。
答案 0 :(得分:1)
您不应该使用联接来执行此操作,因为您可能会从异常中猜到。您应该使用两个子查询来测试集合中的值“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")