Невозможно использовать коллекции с InExpression - PullRequest
3 голосов
/ 17 февраля 2010

Я только немного углубился в NHibernate, и у меня возникли проблемы с одним из более «сложных» (для меня!) Запросов, которые я должен написать.Сценарий:

У меня есть объект «Посох», к которому прикреплена коллекция «Умений».Я хотел бы передать список «Навыков» для запроса (например, если мне нужны только люди, которые могут либо «Готовить», либо «Кодировать», либо и то, и другое) и вернуть список подходящих сотрудников, но у менянебольшая проблема ....

То, что у меня есть по-объектному:

public class StaffMember : Resource
{
    public virtual string EmployeeId { get; set; }      

    public virtual bool IsTeamLeader { get; set; }

    public virtual StaffMember TeamLeader { get; set; }

    public virtual IList<Skill> Skills { get; set; }
}

public class Skill : BaseDomainObject
{
    public virtual string Name { get; set; }
}

И я думаю, что SQL будет выглядеть примерно так:

select distinct st.*
from staff st, resource re
inner join staffskills sks on re.id = sks.staffresourceid
inner join skill ski on ski.id = sks.skillid
where st.resourceid = re.id
and ski.id in (1,2,3,4)

Я пытался использовать «Expression.InG (« Skills », skillSearchList)» в критериях, но его нельзя использовать, когда в игре находятся две коллекции (например, если у них был только один навык, это было бы хорошо!).... какие-нибудь указатели?

1 Ответ

5 голосов
/ 18 февраля 2010

Вам нужно

.CreateAlias("Skills", "sks")
.Add(Restrictions.In("sks.id", skillIdList))

Я не уверен, что это можно сделать с помощью списка объектов умений. В любом случае, sql будет таким же, как указано выше.

Обратите внимание, что это создаст декартово произведение, так что вы можете использовать существующий подзапрос или .SetResultTransformer(new DistinctRootEntityResultTransformer()), чтобы получить список различных сотрудников.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...