Сначала я покажу, что хочу сделать, а потом объясню свою проблему.
У меня есть 2 таблицы: «CharItem» и «Attribute», и таблица «ItemAttribute», чтобы связать обе, так как это отношение m: n. Эта таблица также может определять значение для атрибута.
Я хотел найти все элементы, имеющие хотя бы некоторые атрибуты. Запрос sql это:
SELECT ci.*
FROM CharItem ci
INNER JOIN ItemAttribute ia
on ci.CharItemId = ia.CharItemId
WHERE
(
(ia.AttributeId = 48 and ia.ValueX >= 1)
or (ia.AttributeId = 6)
)
GROUP BY ci.CharItemId
HAVING count(ia.AttributeId) >= 2
Итак, как вы можете видеть, я хочу найти все элементы, поэтому мой запрос должен
верните мне несколько предметов.
Я попытался сделать это, и я думаю, что я почти нашел решение, но
Я что-то упустил. Следующим методом я возвращаю товар
идентификаторы, но не полный элемент, и я не могу найти, как получить полный элемент: x
var query = Session
.CreateCriteria(typeof(CharItem), "ci")
.CreateCriteria("ci.ItemAttribute", "ia", JoinType.InnerJoin);
Disjunction disjunction = Restrictions.Disjunction();
foreach (var entry in itemAttribs)
{
var attribute = entry.Key;
var sign = entry.Value.Item1;
var value = entry.Value.Item2;
var restrictAttrib = Restrictions.Eq("ia.Attribute", attribute);
Conjunction conjunction =Restrictions.Conjunction();
conjunction.Add(restrictAttrib);
conjunction.Add(Restrictions.Eq("ia.Value", values[j]));
disjunction.Add(conjunction);
}
query.Add(disjunction);
query.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("ci.CharItemId"),"CharItemid"));
query.Add(Restrictions.Ge(Projections.Count("ia.Attribute"), itemAttribs.Count));
}
var charItems = query.List<CharItem>();
Спасибо за вашу помощь.
Решено! Проверьте ответы, чтобы узнать, как это сделать.