使用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)中插入了一个元素。当我在.insert(index,object)
之前SaveChanges()
之后查看表时,列表确实将新对象放在正确的位置,但它没有将PositionInList设置为{中指定的索引的值{1}}。它是否应该和我没有正确编码?此外,PositionInList将不得不在所有对象中产生变化 - 我对此负责吗?
我需要学习的预定义方法,当我插入时会操纵PositionInList吗?
我还希望用户能够将项目移动到列表中的新位置。是否有模式可以做这种事情,或者再一次是由我决定的?
在下面的评论中添加了每个请求:
该应用程序分为3层:UI,域,存储。存储层包括一个存储服务类,它具有与SQL Server连接的CRUD方法。
这是当前.insert(index,object)
方法之一。目前它只在列表末尾附加一条记录。根据您的评论,当调用Create
请求在列表中的某个位置插入时,我将修改它以更新PositionInList。这将需要当前未在方法中编码的其他参数。
create
答案 0 :(得分:0)
您可以使用SortedSet,这样就不必重新排序。
Class Parent
:
Public SortedSet<Something> SomeList = new SortedSet<Something>(
new FuncComparer<Something>( (a, b) => a.PositionInList.CompareTo(b.PositionInList ) ));
End Class