2009-12-20 3 views
0

У меня есть таблица, в которой хранятся контакты и их телефоны.
Контакт: ContactId (интермедиат, PK), FirstName (VARCHAR), LastName (VARCHAR)
Телефон: PhoneId (интермедиат, PK), ContactId (Int FK), номер (VARCHAR), SortOrder (TINYINT)Пользовательский порядок сортировки с SQL-Server и .NET Entity-Framework

Я хочу, чтобы при каждом контакте пользователь должен был поддерживать приоритет телефонов, что означает, что столбец SortOrder телефона должен находиться под каждым контактом по последовательным номерам.

Например, при добавлении первого телефона пользователю его SortOrder должен стать 1, для второго 2 и так далее.

Скажите, что пользователь добавил 5 телефонов пользователю, теперь он хочет переместить телефон (с заказом) 3 на место 2, он должен нажимать ток 2 на место 3 и наоборот.

Если он хочет, чтобы телефон 1 К последнему он должен «тянуть» SortOrder всех телефонов на -1, а затем присвоить предыдущий 1 до 5.

Я хочу, чтобы эта система была последовательной и не иметь открытой края, где у меня есть:

  • 2 телефона с одинаковыми значениями порядка сортировки в одной группе
  • Первый телефон в группе со значением выше, чем 1
  • Последний телефон в группе со значением выше или меньше, чем количество телефонов в группе
  • и т. Д. И т. Д. И т. Д.

Я думаю, что я до сих пор довольно ясен (я).

Теперь мой вопрос, учитывая, что я извлекаю данные с помощью .NET EF в настольном приложении, и я буду обращаться к телефонам, используя свойство навигации Contact.Phones.

Следует внедрить эту систему в DAL или на сервере AFTER INSERT, UPDATE trigger?
Я лично думаю, что это должно быть реализовано на сервере, потому что представить, что разные пользователи одновременно играют с одними и теми же контактными телефонами, это может нарушить согласованность, а?

Любые советы, ссылки, коды, советы по поводу этой проблемы сортировки будут приветствоваться.

Я также думал о ROWNUMBER() как о хорошей идее получения данных, но мне нужно поддерживать сортировку, а не только ее выбирать.

Примечания:
В общем, я задал вопрос в продолжении this ответа, я решил использовать, пример контактного телефона был просто сделать вещи простыми. Я нашел this после обсуждения моей проблемы, но там не было предоставлено никаких технических советов.

Заранее спасибо.

ответ

0

Ваша квадратная привязка круглого отверстия здесь.

Ваш ответ МОЖЕТ быть таким же простым, как Contact.Phones.OrderBy (@p => @ p.SortOrder), а затем заботиться обо всех ваших телефонах в контакте.SetPhone (телефон, порядок), который может охватывать любую настраиваемую логику.

Кроме того, поскольку это бизнес и логика просмотра, ваш магазин persistence не должен знать, что происходит.

+0

У меня такое ощущение, что вы не прочитали вопрос и мои соображения, я хочу сделать это в SQL, чтобы избежать непреднамеренных выборок для необходимых вам обновлений. Кроме того, вы могли бы обновить свой вопрос и разработать SetPhone thingy; как получить параметр «порядок»? – Shimmy

+0

Я прочитал его. Я просто не знаю, откуда эти выборы. Если у вас есть коллекция контактов, обновите все заказы сортировки, а затем сохраните изменения. EntityFramework просто выплюнет операторы обновления. – jfar

+1

Предположим, что у меня есть контакт с 30 телефонами (в этом примере это своего рода rediculus, в моем приложении я использую то, что имеет много записей в каждой группе). Я получаю контакт через EF без его телефонов, затем добавляю новый телефон с SortOrder = 5, я хочу, чтобы сервер выполнял эту работу для меня и нажимал следующие записи SortOrder + = 1, поэтому мне не нужно перезагрузите группу и сохраните ее, это просто ненужная обратная связь + передача данных. – Shimmy

Смежные вопросы