NHibernate: обратная версия в ()? - PullRequest
2 голосов
/ 29 апреля 2009

Я пытаюсь выполнить то, что могу описать только как обратную версию IN () с использованием Nhibernate Criteria ..

Вместо того, чтобы говорить, что значение, сохраненное в свойстве, находится в списке / коллекции X

Я хочу сказать, что это значение X (идентификатор) находится в списке, который является свойством объекта.

Любая помощь приветствуется, я могу попытаться объяснить лучше, если это не имеет смысла.

РЕДАКТИРОВАТЬ Извинения перед людьми, как я понимаю, это не имеет достаточного смысла ...

В моей системе есть элемент «Событие», в котором может быть список аудитории (элементов), к которой он относится. Если администратор хочет удалить элемент аудитории, я хочу убедиться, что на элемент не ссылаются никакие события. (AudienceList хранится в виде списка идентификаторов для аудиторий).

То, что я думал, было чем-то вроде:

var results = SessionInstance.Session.CreateCriteria (typeof (EventItem.Items.EventItem)) .Add (Restrictions.In ("AudienceList", myAudience.ID)) .List ();

Но мне нужно, чтобы AudienceList и myAudience.ID были наоборот, не так ли? У меня есть идентификатор аудитории, но нужно проверить, что он может быть в списке других идентификаторов.

Еще раз спасибо.

РЕДАКТИРОВАТЬ 2

Определение EventItem таково, что одним из его свойств является DetailCollection идентификаторов аудитории, они сохраняются в БД в виде строкового списка идентификаторов.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2009

РЕДАКТИРОВАТЬ: Отменить мой предыдущий ответ.

Ну, похоже, здесь нет настоящей реляционной модели, поэтому все будет не так красиво. Без внешних ключей и тому подобного я не уверен, что NHibernate будет очень полезен в этой ситуации (по крайней мере, для создания хорошего запроса).

Если все идентификаторы аудитории для одной записи события хранятся в одном поле, вам придется либо использовать SQL LIKE, либо делать это в коде. Извлеките все EventItems и переберите их, проверив их коллекции AudienceList на предмет идентификатора, который вы ищете. Если вы идете по этому пути, может быть лучше создать DTO, чтобы минимизировать объем перемещаемых данных. Что-то вроде

session.CreateQuery("select new AudienceListDTO(e.AudienceList) from EventItems e").List();

Это предполагает, что вам просто нужно сообщить пользователю, что «этот тип аудитории все еще используется», а не указывать на конкретные случаи. В противном случае вам придется добавить больше данных.

0 голосов
/ 29 апреля 2009

Вы имеете в виду что-то подобное?

class YourClass {
    List<int> theList;
}

IQueryable<YourClass> query = ...;
var result = from c in query where c.theList.Contains(value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...