【问题标题】:Custom sort-order with SQL-Server and .NET Entity-Framework使用 SQL-Server 和 .NET Entity-Framework 自定义排序顺序
【发布时间】:2009-12-20 03:24:40
【问题描述】:

我有一个存储联系人及其电话的表。
联系人:ContactId (int, PK), FirstName (varchar), LastName (varchar)
Phone: PhoneId (int, PK), ContactId(int FK), Number (varchar), SortOrder (tinyint)

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

例如,将第一个电话添加到用户时,其 SortOrder 应为 1,第二个为 2,依此类推。

假设用户向用户添加了 5 个手机,现在他想将手机(有订单)3 移动到放置 2,它应该将当前 2 推送到放置 3,反之亦然。

如果他想让电话 1 持续使用,它应该将所有电话的 SortOrder '拉'-1,然后将之前的 1 分配给 5。

我希望这个系统保持一致,并且在我拥有的地方没有开放的边缘:

  • 一组具有相同排序顺序值的 2 部手机
  • 组中的第一个电话值大于 1
  • 组中最后一个电话的值高于或小于组中电话数量的电话
  • 等。等等等等。

到目前为止,我认为我很清楚(是吗)。

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

应该在 DAL 中还是在服务器 AFTER INSERT, UPDATE 触发器中实现这个系统?
我个人认为这必须在服务器上实现,因为想象不同的用户同时使用相同的联系电话,这可能会破坏一致性,是吧?

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

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

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

提前致谢。

【问题讨论】:

    标签: sql-server-2005 entity-framework sorting


    【解决方案1】:

    你的方格在这里钉了一个圆孔。

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

    此外,由于这是业务和视图逻辑,您的持久性存储不应该知道发生了什么。

    【讨论】:

    • 我感觉您没有阅读问题和我的考虑,我确实想在 SQL 中执行此操作,以避免对需要更新的批量进行不必要的选择。此外,您能否更新您的问题并详细说明 SetPhone 问题;将如何检索它的“订单”参数?
    • 我确实读过它。我只是不确定这些选择来自哪里。如果您有一组联系人,请更新所有排序顺序,然后保存您的更改 EntityFramework 只会输出更新语句。
    • 假设我与 30 部电话有联系(在本例中,它有点像 rediculus,在我的应用程序中,我使用了每组中都有很多记录的东西)。我在没有电话的情况下通过 EF 获得了联系,然后我添加了一个带有 SortOrder = 5 的新电话,我希望服务器应该为我完成这项工作并推送以下记录的 SortOrder +=1,所以我不需要重新加载组并保存,这只是不必要的往返+数据传输。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多