在该方法按照以下步骤执行:
1.
使用命令对象对象执行
pr_GetLocations
存储过程返回结果集
2.
如果数据阅读器读取了数据(
reader.Read
方法返回
true
)执行:
2.1.
从数据阅读器当前记录中读取
Location
对象,并返回层数信息(
out level
)
2.2.
如果是第一层(
level
等于
0
)填充
locs
集合,并加入到
container
对象
2.3.
如果不是第一层根据层标志(
oldlevel
)判断当前层是否是新的一层
2.4
如果当前层是新的一层清空
container
集合并将
current
集合中实体复制到
container
集合中,清空
current
集合并置层标志(
oldlevel
)
2.5
将当前对象添加到
current
集合中
2.6
调用
CreateLocation
方法从
container
上层集合中匹配当前实体父级对象并加入父对象的子集合中
3.
重复第
2
步直到读取完全部数据
可以看到 container 集合始终保存了当前层的上层所有的实体对象,并且为了在更换层数后能够正确的更新 container 集合,使用 current 集合保存当前层的实体对象。
3.8 编写 GetLocationFromReader 方法,用于从数据阅读器中返回 Location 实体对象,并将层数信息使用 out 参数返回:
private Location GetLocationFromReader(SqlDataReader reader, out int level)
{
Location loc = new Location();
loc.Id = Convert.ToInt32(reader["id"]);
loc.Name = Convert.ToString(reader["name"]);
object o = reader["parent"];
if (o != DBNull.Value)
loc.ParentId = Convert.ToInt32(o);
level = Convert.ToInt32(reader["loclevel"]);
return loc;
}
3.9 编写 CreateLocation 方法,该方法遍历实体集合找到与当前实体对象的父级编号匹配的实体,并将当前实体加入到父级实体的子集合中:
private void CreateLocation(LocationCollection container, Location loc)
{
foreach (Location location in container)
{
if (location.Id == loc.ParentId)
{
location.SubLocations.Add(loc);
break;
}
}
}
本文来源:不详 作者:佚名