NHibernate на:обратная версия in()?
-
03-07-2019 - |
Вопрос
Я пытаюсь выполнить то, что я могу описать только как обратную версию IN(), используя критерии Nhibernate..
Вместо того, чтобы говорить, что значение, хранящееся в свойстве, находится в списке / коллекции X
Я хочу сказать, что это значение X (идентификатор) находится в списке, который является свойством объекта.
Любая помощь приветствуется, я могу попытаться объяснить лучше, если в этом нет смысла.
Редактировать Приношу извинения людям, насколько я понимаю, в этом нет достаточного смысла...
У меня есть элемент события в моей системе, который может содержать список аудитории (элементов), к которым он применяется.Если администратор хочет удалить элемент аудитории, я хочу проверить, что на этот элемент не ссылаются никакие события.(AudienceList хранится в виде строкового списка идентификаторов аудиторий).
То, о чем я думал, было чем-то вроде:
var results = SessionInstance.Сеанс.Создайте критерий(typeof(EventItem.Товары.EventItem)) .Добавить(Ограничения.В("Список аудитории", myAudience.ID)) .Список();
Но мне нужен AudienceList и myAudience.ID должен быть наоборот, не так ли?У меня есть идентификатор аудитории, но мне нужно проверить, что он может быть в списке других идентификаторов.
Еще раз спасибо.
ПРАВКА 2
Определение EventItem таково, что одним из его свойств является подробная коллекция идентификаторов аудитории, они сохраняются в базе данных в виде строкового списка идентификаторов.
Решение
Редактировать:Отклонил мой предыдущий ответ.
Ну, похоже, здесь нет настоящей реляционной модели, так что все будет не так красиво.Без внешних ключей и тому подобного я не уверен, что NHibernate будет полезен в этой ситуации (по крайней мере, для генерации хорошего запроса).
Если все идентификаторы аудитории для одной записи события хранятся в одном поле , вам придется либо использовать SQL LIKE , либо сделать это в коде.Извлеките все элементы EventItems и выполните итерацию по ним, проверяя их коллекции AudienceList на наличие нужного идентификатора.Если вы пойдете по этому пути, возможно, было бы лучше создать DTO, чтобы свести к минимуму объем данных, которые вы перемещаете.Что -то вроде
session.CreateQuery("select new AudienceListDTO(e.AudienceList) from EventItems e").List();
Это предполагает, что вам просто нужно сообщить пользователю, что "этот тип аудитории все еще используется", а не указывать конкретные экземпляры.В противном случае вам придется добавить больше данных.
Другие советы
Вы имеете в виду что-то вроде этого?
class YourClass {
List<int> theList;
}
IQueryable<YourClass> query = ...;
var result = from c in query where c.theList.Contains(value);