Список против набора против сумки в NHibernate

В чем разница между списком, множеством и сумкой в ​​файле сопоставления NHibernate? Как каждый относится к коллекциям .NET?

Ответ 1

Семантика NHibernate:

  • Список: упорядоченный сбор объектов, разрешенный дубликат. Используйте код .NET IList в коде. Столбец индекса должен отображаться в NHibernate.

  • Set: неупорядоченный набор уникальных объектов, дубликаты не допускаются. Используйте Iesi.Collection.ISet в коде (NH до v4) или System.Collections.Generic.ISet (NH v4 +). Важно переопределить GetHashCode и Equals, чтобы указать бизнес-определение дубликата. Может сортироваться путем определения порядка или путем определения компаратора, результатом которого является результат SortedSet.

  • Мешок: неупорядоченный список сущностей, допустимые дубликаты. Используйте код .NET ICollection<T> в коде. Столбец индекса списка не отображается и не выполняется NHibernate.

Ответ 2

Все эти объекты в NHibernate точно такие же, как и другие реализации этих абстрактных типов данных (ADT). Я был удивлен, как трудно найти Sets and Bags онлайн из-за того, насколько распространены имена для других вещей, поэтому я перечислил некоторые ссылки и описания здесь.

Для получения более подробной информации просмотрите следующее: Списки, Устанавливает и Сумки

Общие правила:

Списки по умолчанию упорядочены, используйте их, если хотите, чтобы вытащить объект по его индексу, или у вас странная привязанность к for циклам по циклам foreach. Вы не обязаны обращаться к ним так, как вам нужно, в Связанный список. Этот ADT позволяет дублировать.

Обратите внимание! Хотя списки упорядочены, как упоминал BryanD в своем ответе, абсолютно ничего не говорится о том, что он должен быть в том порядке, который вы ожидаете от базы данных при выполнении запроса HQL, если вы не укажете порядок по команде. Именно из-за этого некоторые люди предпочитают использовать Set или Bags вместо этого, так что это не дает иллюзии того, чтобы быть заказанным. Хотя я говорю это, большую часть времени они будут отображаться в видимом порядке, поскольку они добавляются в список в том порядке, в котором они находятся в запросе, который запускается NHibernate.

Наборы не по умолчанию упорядочены, вы не можете получить доступ к любой переменной напрямую через индекс. Установки по умолчанию представляют собой только ADT из трех предыдущих, которые сохраняют уникальность своих объектов. Это здорово, если у вас есть коллекция, если вам не требуется дубликатов.

Сумки (или Multisets) являются, как видно из приведенных выше ссылок, типом Set, который позволяет объектам внутри него дублировать другие объекты. Они обычно не используются, поскольку упорядочение списков можно игнорировать и, следовательно, рассматривать как сумку.

В отношении того, как они используются в NHibernate, ничто не извлекается из базы данных по-разному в зависимости от того, какой ADT вы выбрали здесь, именно это вы хотите использовать, поскольку это должно заставить вас выбрать другой ADT.

Лично я использую Sets для большинства вещей, поскольку я обычно требую, чтобы дочерние объекты были уникальными, а упорядочение не является проблемой. Хотя я буду использовать списки, в которых у меня есть группа объектов, которые я хочу упорядочить чем-то, например, временем, для достижения этого порядка мне нужно вручную установить "порядок по" в запросе HQL.

Ответ 3

Ну, основное отличие состоит в том, что списки имеют неявный порядок для элементов, индексированных по их позиции в списке. Наборы и сумки также могут быть "упорядочены" обычно с помощью компаратора или предложения order by, который применяется, когда эти элементы выходят из БД. Лично я никогда не использовал Bags... если я знаю, что данные, которые я хочу, упорядочиваются последовательно, я использую List, иначе я использую Set.

Ответ 4

Set не позволяет вам иметь повторяющиеся элементы. Если вы попытаетесь добавить какой-то новый элемент, он будет сравнивать (используется метод Equals) каждый элемент, который уже находится в коллекции, с тем, который вы добавляете, и если один повтор возвращает true, элемент не будет добавлен