Sql server 2005 使用SQL Server和.NET实体框架自定义排序顺序

Sql server 2005 使用SQL Server和.NET实体框架自定义排序顺序,sql-server-2005,entity-framework,sorting,Sql Server 2005,Entity Framework,Sorting,我有一个表,用于存储联系人及其电话。 联系人:联系人ID(int,PK)、名字(varchar)、姓氏(varchar) 电话:PhoneId(int,PK)、ContactId(int-FK)、Number(varchar)、SortOrder(tinyint) 我希望在每个联系人下,用户应该能够保持电话的优先级,这意味着电话的SortOrder列应该在每个ContactId下按连续数字排列 例如,当向用户添加第一部手机时,其排序器应为1,第二部为2,依此类推 假设用户向一个用户添加了5个电话

我有一个表,用于存储联系人及其电话。
联系人:联系人ID(int,PK)、名字(varchar)、姓氏(varchar)
电话:PhoneId(int,PK)、ContactId(int-FK)、Number(varchar)、SortOrder(tinyint)

我希望在每个联系人下,用户应该能够保持电话的优先级,这意味着电话的SortOrder列应该在每个ContactId下按连续数字排列

例如,当向用户添加第一部手机时,其排序器应为1,第二部为2,依此类推

假设用户向一个用户添加了5个电话,现在他想将电话(带订单)3移动到位置2,它应该将当前的2推到位置3,反之亦然

如果他想让电话1持续,它应该将所有电话的排序“拉”到-1,然后将前面的1分配到5

我希望该系统保持一致,并且在以下情况下不具有开放边缘:

  • 一组中有两部具有相同排序顺序值的手机
  • 组中值大于1的第一部电话
  • 值大于或小于组中电话数的组中最后一部电话
  • 等等等等等等
我想到目前为止我已经很清楚了

现在我的问题是,考虑到我在桌面应用程序中使用.NET EF检索数据,我将使用Contact.phones导航属性访问手机

插入、更新触发器后,应在DAL或服务器
中实现此系统?
我个人认为这必须在服务器上实现,因为想象一下不同的用户同时使用同一部手机,这可能会破坏一致性,是吗

有关此自定义排序问题的任何提示、链接、代码、建议和笑话都将受到欢迎

我还认为ROWNUMBER()是检索数据的好主意,但我需要维护排序,而不仅仅是选择它

注:
一般来说,我在继续回答的过程中问了这个问题,我决定使用,联系电话的例子只是为了让事情变得简单。 我发现有帖子讨论了我的问题,但没有提供任何技术建议


提前谢谢。

您的正方形在这里钉了一个圆孔

您的答案可以像Contact.Phones.OrderBy(@p=>@p.SortOrder)一样简单,然后在Contact.SetPhone(phone,order)方法中处理您的所有电话,该方法可以包含您想要的任何自定义逻辑


另外,因为这是业务和视图逻辑,所以您的持久性存储不应该知道发生了什么。

我感觉您没有阅读问题和我的注意事项,我确实希望在SQL中执行此操作,以避免为需要更新的块找到不必要的选择。此外,你能更新你的问题并详细阐述一下SetPhone的内容吗;如何检索它的'order'参数?我读过了。我只是不确定这些选择来自哪里。如果您有一组联系人,请更新所有排序顺序,然后保存更改EntityFramework只会发出更新语句。假设我有一个30部手机的联系人(在本例中,这是一种rediculus,在我的应用程序中,我使用的每个组中都有许多记录的东西)。我通过EF获得联系人,但没有手机,然后我添加了一个SortOrder=5的新手机,我希望服务器为我完成这项工作,并推送以下记录'SortOrder+=1,因此我不需要重新加载组并保存它,这只是不必要的往返+数据传输。