Список по сравнению с набором по сравнению с сумкой в NHibernate

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

105
задан Mani Gandham 6 July 2012 в 23:03
поделиться

4 ответа

Семантика NHibernate:

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

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

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

225
ответ дан 24 November 2019 в 03:57
поделиться

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

1
ответ дан 24 November 2019 в 03:57
поделиться

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

0
ответ дан 24 November 2019 в 03:57
поделиться

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

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

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

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

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

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

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

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

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

21
ответ дан 24 November 2019 в 03:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: