Так что у меня есть много-много отношений между чем-то, известным как Specialism и SpecialismCombo.То, что я пытаюсь сделать, это взять int [] из идентификаторов и проверить, есть ли уже комбо, содержащее специализации с этими идентификаторами.
Я был близок, но не совсем прав.Скажем, у меня есть специализации с идентификаторами 1 и 3, и я создаю комбо с этими специализациями.
Если я передам 3 и 1, то он возвращает ожидаемый комбо-идентификатор.
Если я передам 1затем он возвращает комбо-идентификатор с 1 и 3.
Я не могу просто полагаться на общее количество специализаций, связанных с комбо.Потому что, если у комбо есть два элемента, 1 и 4, и совпадающие элементы равны 1 и 3, я не хочу, чтобы это возвращалось как совмещенное комбо.
Так что мне нужно подсчитать эторезультат, и сопоставьте количество общих специализаций, связанных с комбо.Я не совсем понимаю, подхожу ли я подзапросу или критериям detatched, или как получить желаемый результат, используя критерии nhibernate.Спасибо за вашу помощь!
int[] SpecialismIds = ArrayExtensions.ConvertArray<int>(idCollection.Split(new char[] { '|' }));
ICriteria query = m_SpecialismComboRepository.QueryAlias("sc");
query.CreateAlias("sc.Specialisms", "s", NHibernate.SqlCommand.JoinType.InnerJoin);
ICriterion lastCriteria = null;
foreach(int i in SpecialismIds)
{
ICriterion currentCriteria = Restrictions.Eq("s.SpecialismId", i);
if (lastCriteria != null)
lastCriteria = Restrictions.Or(lastCriteria, currentCriteria);
else
lastCriteria = currentCriteria;
}
if (lastCriteria != null)
query.Add(lastCriteria);
IProjection IdCount = Projections.Count("s.SpecialismId").As("IdCount");
query.SetProjection(
Projections.GroupProperty("sc.SpecialismComboId"),
IdCount
);
query.Add(Restrictions.Eq(IdCount, SpecialismIds.Count()));
var comboId = query.List();
Создается sql:
SELECT this_.SpecialismComboId as y0_, count(s1_.SpecialismId) as y1_
FROM dbo.SpecialismCombo this_
inner join SpecialismComboSpecialism specialism3_ on this_.SpecialismComboId=specialism3_.SpecialismId
inner join dbo.Specialism s1_ on specialism3_.SpecialismComboId=s1_.SpecialismId WHERE s1_.SpecialismId = @p0
GROUP BY this_.SpecialismComboId HAVING count(s1_.SpecialismId) = @p1',N'@p0 int,@p1 int',@p0=3,@p1=1
РЕДАКТИРОВАТЬ - Кажется, мне нужно либо что-то вроде ...
HAVING count (s1_.SpecialismId) = (выберите count (SpecialismId) из specialismComboSpecialism, где SpecialismComboId = y0 group by SpecialismComboId) == @ p2
Или, может быть, это проще, и мне нужно исключить SpecalismCombos, гдеcombo.specialisms не в коллекции идентификаторов.
Т.е.если в комбо есть специализации 1 и 3, но в коллекции только 1 .. тогда мы можем исключить это комбо, если 3 не находятся в коллекции ...
Редактировать 8/8/2011 ПошлиВернемся к тому, как получить нужный мне результат в SQL - и я считаю, что этот запрос работает.
WITH CustomQuery AS
(
SELECT sc.SpecialismComboId,
count(s.SpecialismId) AS ItemCount
FROM SpecialismCombo sc
inner join SpecialismComboSpecialism scs on sc.SpecialismComboId = scs.SpecialismComboId
inner join Specialism s on s.SpecialismId = scs.SpecialismId
GROUP BY sc.SpecialismComboId
HAVING count(s.SpecialismId) = 2
)
SELECT CustomQuery.SpecialismComboId FROM CustomQuery
INNER JOIN SpecialismComboSpecialism scs on CustomQuery.SpecialismComboId = scs.SpecialismComboId
WHERE scs.SpecialismId in (1,4)
GROUP BY CustomQuery.SpecialismComboId
HAVING count(scs.SpecialismId) = 2
Итак, теперь мне просто нужно выяснить, как вызвать эту процедуру из моего кода nhibernate, передаваемого всоответствующие значения :)
Я также обнаружил в процессе, что мой класс отображения был неправильным - так как он помещал неправильные значения в таблицу отображения (т. е. specialismid заканчивался в поле specialismcomboid!)