Фрагмент кода ниже описывает, что я хочу сделать с помощью запросов, но он взрывается с вышеуказанной ошибкой.
Между зданиями и 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)
перед добавлением псевдонима, чтобы ошибка «Дубликат псевдонима» не возникала, но при этом возникает только одно объединение, и это приводит к SQL-выражению where, которое никогда не будет истинным
SELECT *
FROM Buildings this_
inner join AttributeValues attributev1_
on this_.Id = attributev1_.BuildingId
WHERE
attributev1_.Value = 'Large'
and attributev1_.Value = 'Blue'
Это не сложный или необычный запрос, поэтому я бы удивился, если бы не было обходного пути.