【发布时间】:2012-06-15 08:17:11
【问题描述】:
我一直在浏览搜索系统,但没有找到我的问题的答案,虽然这些问题很相似,我什至用其中一些作为开始,但我碰了壁。
我已经检查了这些问题
我有一个由 nHibernate 带回的名为 Person 的对象,如下所示
public class Person : IPerson, IComparable<Person>{
// private properties
private int _id;
private string _name;
private Person _parent;
private IList<Person> _children;
private IList<Group> _groups;
// public properties
public virtual int id
{
get { return _id; }
set { _id = value; }
}
public virtual string name
{
get { return _name; }
set { _name= value; }
}
public virtual Person Parent
{
get { return _parent; }
set { _parent = value; }
}
public virtual IList<Person> Children
{
get { return _children; }
set { _children = value; }
}
public virtual IList<Group> Groups
{
get { return _groups; }
set { _groups = value; }
}
// constructor
public Person() {}
// this section I added after looking on SO
public virtual Int32 parentid
{
get {
if (_parent == null)
{
return _id;
} else {
return _parent.id;
}
}
}
public virtual Int32 CompareTo(Person obj)
{
if (this.id == obj.id)
return 0;
return this.parentid.CompareTo(obj.parentid);
}
}
然后是我的 Dao 中的一个方法,它返回一个组下数据库中所有 Person 对象的列表。不幸的是,它使它们按输入顺序返回,我想将它们分类为父子关系。
i.e. (id,name,parent)
person 1 (1,"Alice",null)
person 2 (2,"Bob",1)
person 3 (3,"Charlie",null)
person 4 (4,"Dejgo",2) // child of a child
person 5 (5,"Edgar", null)
person 6 (6,"Florence", 3)
当我按照answer 中提到的那样进行排序时:
class PeopleBLL : IPeopleBLL {
// spring properties
private IGroupsBLL _groupsBLL;
private IPeopleDao _peopleDao;
// public properties where spring sets up the links to the other dao and bll methods
public IGroupsBLL {
set{_groupsBLL = value;}
}
public IPeopleDao {
set{_peopleDao= value;}
}
// constructor
public PeopleBLL()
{
}
// method we are interested in
public IList<Person> GetAllInGroup(int groupID){
//get the group object
Group groupObject = _groupsBLL.Get(groupID);
// get the people in the group
IList<Person> people = _peopleDao.GetAllInGroup(groupObject);
// do something here to sort the people
people.Sort();
// return the list of people to aspx page
return people;
}
}
我得到格式的列表
person 2
person 1
person 6
person 3
person 5
person 4
但我想要它的格式
person 1
person 2
person 4
person 3
person 6
person 5
有什么想法吗?
编辑:
我没有把剩下的内容放进去,因为我不想被使用的所有额外技术混淆这个问题,但是因为我被问到了。 Spring.Net 用于连接所有对象,我有一个 3 层架构前端(asp.net 页面)、业务层和与数据库通信的 Dao 层。我更新了 GetAllInGroup() 以显示它所做的一切,但这只是我感兴趣的排序。Dao 使用 nHibernate Criteria Query 来获取组下的所有对象,如下所示。
public IList<Person> getRegistrationsForDonor(Group groupObject) {
IList<Person> rv = CurrentSession.CreateCriteria(typeof(Person),"p")
.CreateCriteria("Groups","g")
.Add(Expression.Eq("g.id", groupObject.id))
.List<Person>();
return rv;
}
所有这一切都是在对象数据源中的 aspx 页面中开始的
<asp:ObjectDataSource ID="ObjectDataSource1" OnObjectCreating="DataSource_ObjectCreating" runat="server" DataObjectTypeName="Domain.Person" TypeName="BusinessLayer.PersonBLL" DeleteMethod="delete" SelectMethod="GetAllInGroup" UpdateMethod="update">
<SelectParameters>
<asp:ControlParameter ControlID="groupid" Type="Int32" DefaultValue="0" Name="groupID" />
</SelectParameters>
</asp:ObjectDataSource>
然后由 gridview 使用,所以不幸的是,我需要将 BLL 中的排序 IList 作为单个 IList 返回到 BLL 方法的前端。
编辑 2
抱歉,假设所有父级在顶层都为空,我可以理解该假设的来源,但理论上您可以在组中只有子级,因此没有一个对象的父级为空值。例如以下是一个有效的组。
person 2 (2,"Bob",1)
person 4 (4,"Dejgo",2) // child of a child
person 6 (6,"Florence", 3)
我希望它会返回
person 2
person 4
person 6
编辑 3
很遗憾,所有这些都无法在评论中推测出来,所以我必须在这里回复。
在 17:30 尝试了@jon-senchyna 的回答,我肯定越来越近了,我刚刚在一些实时数据上尝试了这个,它几乎就在那里,但我似乎遇到了孩子在父母面前出现的问题在群里。以下面的示例为例,第 1 组有 48 人,我将突出显示感兴趣的人。
(789, "person 1", null)
(822, "Person 34", null)
(825, "Person 37", 789)
(3060, "Person 47", 822)
(3061, "Person 48", 825)
这是它们从数据库中返回的顺序,但是当它们通过排序时,它们是在顺序中的
Person 48 - id: 3061
Person 37 - id: 825
Person 1 - id: 789
Person 47 - id: 3060
Person 34 - id: 822
所以孩子们在父母旁边,但顺序相反,我希望他们按顺序排列
Person 1 - id: 789
Person 37 - id: 825
Person 48 - id: 3061
Person 34 - id: 822
Person 47 - id: 3060
【问题讨论】:
-
能否请您也发布其余代码,以便清楚地了解您在代码中所做的工作。
-
副手,我会确保类被映射以识别父子关系。然后我会做类似'var q = from p in session.Query
where p.parent == null order by p.name'之类的事情。然后让 NHibernate 完成剩下的工作。覆盖 CompareTo 以使用名称或其他内容可能不是一个坏主意。 -
只是一个随机注释,您在声明
_parent之后缺少一个分号,并且您的_children列表应该是Person类型,而不是person。我试图进行编辑,但 SO 抱怨说我没有更改至少 6 个字符... -
是的@jon-senchyna 抱歉,这只是一个错字,如果在真实代码中是这样,代码将无法编译。不过是个好地方。
-
@kamui 接受的答案没有正确处理嵌套的父母。请在下面查看我的 cmets。