【问题标题】:How do I save a reordered list back to the SQL Server?如何将重新排序的列表保存回 SQL Server?
【发布时间】:2018-07-10 00:49:13
【问题描述】:

使用 EF6 和 SQL Server。这个问题是问我的代码是否朝着正确的方向发展。

使用各种 SO 帖子,我能够定义包含列表并合并 IComparable(Of T) 的类。尽管列表中的对象具有可用于排序的属性(例如日期),但我需要维护一个用户定义的顺序,该顺序完全取决于用户希望如何排列对象。

我的第一个假设是我必须维护一个独特的属性来维护用户定义的顺序。那是对的吗?这是我当前定义的一个非常简化的示例:

Class Parent
  :
  Public Property SomeList as List(Of Something)
End Class

Class Something
  Implements IComparable(of Something)
  :
  public property PositionInList as Integer
  Public Function CompareTo(that As Something) As Integer ...
    Return PositionInList.CompareTo(that.PositionInList)
  End Function
End Class

如果我写以下内容:

dim aList as New List(Of Something)
aList = Parent.SomeList
aList.Sort()

...alist 按照我的预期是基于 PositionInList 排序的。

如果我想在列表中插入一条新记录,我是否负责在列表中的所有对象中更改 PositionInList 的值?我问的原因是因为.insert(index,object) 形式的LINQ 命令表明它将一个元素插入到指定索引处的List(Of T) 中。当我在SaveChanges() 之前查看.insert(index,object) 之后的表格时,该列表确实在正确的位置有新对象,但它没有将PositionInList 设置为.insert(index,object) 中指定的索引值。应该是这样,我没有正确编码吗?此外,PositionInList 将不得不影响所有对象的变化——我对此负责吗?

我需要学习哪些预定义的方法可以在我插入时操纵 PositionInList?

我还希望用户能够将项目移动到列表中的新位置。是否有做这种事情的模式,还是这完全取决于我?

根据请求在下面的评论中添加:

应用分为3层:UI、域、存储。存储层包括一个存储服务类,它具有与 SQL Server 接口的 CRUD 方法。

这是当前Create 方法之一。目前它只在列表末尾附加一条记录。根据您的评论,当对 create 的调用请求在列表中的某处插入时,我将对其进行修改以更新 PositionInList。这将需要方法中当前未编码的附加参数。

Public Overrides Sub ElementCreate(DomainElement As DomainElement)
  Dim aSqlElement As New SqlElement
  aSqlElement.DomainToSqlElement(DomainElement)
  Dim theParent = SqlContext.SqlContents.Include("ContentElements").Where(Function(x) x.ID = aSqlElement.ContentID).SingleOrDefault()
  theParent.ContentElements.Add(aSqlElement)
  SqlContext.SaveChanges()
End Sub

【问题讨论】:

  • 是的,您有责任在列表更改时更新该属性。你能把修改列表的代码贴出来吗?
  • 感谢您确认我需要管理列表中的职位。根据您的要求,我只发布了上面当前的 Create 方法。

标签: sql-server vb.net list linq


【解决方案1】:

您可以使用 SortedSet 代替,这样您就不必重新排序。

Class Parent
:
Public SortedSet<Something> SomeList = new SortedSet<Something>(
  new FuncComparer<Something>( (a, b) => a.PositionInList.CompareTo(b.PositionInList ) ));
End Class

【讨论】:

  • 当您比较的属性是可变的时,这可能不是一个好主意。
  • 他可以将 PositionInList 属性更改为十进制,然后当他想在元素之间添加时,他不会更改其他对象的属性,只需将值设为他要分配的两个元素之间的数字反对
  • @Ctznkane525 使用小数的有趣想法,但我觉得我最终必须维护 PositionInList 属性,即似乎我不能永远调整小数,除非我'我错过了你的观点。但是,至少可以安全地得出结论,您的答案意味着与 npearson 达成协议,我必须操纵 PositionInList;没有“内置”方法可以为我做到这一点。
  • 当您保存时...您将遍历排序集并根据列表中的位置保存,而不是使用 positioninlist 变量本身...所以当您再次从数据库返回时,您将开始使用只有整数的小数
  • 噢!当然......而且,虽然我使用的是整数,但我确实做到了。将查看 SortedSet。
猜你喜欢
  • 2017-07-03
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多