DataBind列表与子相关内容的最佳方式(例如,SO的标签问题)

使用ASP.net 2.0,我如何向用户呈现类似于SO上的问题列表的信息,其中每个问题都有一些子项(如标签)。

我可能会做两个单独的查询,一个是先查找问题列表,另一个查询是查找属于问题列表的所有标签。

方法1:

然后我可能会使用嵌套转发器并在每个嵌套转发器“OnItemDataBind”的代码隐藏中执行select语句…

方法2:

或者使用这两个数据集,我将使用C#代码创建每个“问题”的业务实体,并拥有一个名为“标签”的属性。 然后我会遍历我的标签数据集并分配属性。

什么更有效率? 还有其他选择吗?

我绝对会避免使用第二种方法 – 每次对父项进行数据绑定时都不想访问数据库。 正如DOK所说,尝试正确地构建您的系统。 对我来说,这意味着填充业务对象的集合并绑定到它。 我使用自定义菜单控件执行类似操作(注意这会嵌套三个数据列表,但您可以使用转发器):

在aspx页面中:

  //your object   //your object's child items   //child item's child items       

然后在代码背后:

 protected void dlMenu_ItemDataBound(object sender, DataListItemEventArgs e) { DataListItem parentList = e.Item; DataList dlMenuTwo = (DataList)parentList.FindControl("dlMenuTwo"); MenuItem item = (MenuItem)parentList.DataItem; dlMenuTwo.DataSource = _menu.GetChildItems(item); dlMenuTwo.DataBind(); } 

此方法基本上获取对绑定对象的引用(parentList.DataItem),然后将嵌套的DataList绑定到子项(_menu.GetChildItems(item))

如果您执行两个单独的查询,您仍然可以在对数据库的一次调用中创建它们,并返回两个结果集。

您可以使用效率更高的DataReader(使用两个结果集)代替DataSet。 循环遍历结果集并使用关联的Tag对象或属性填充Question对象。 将这些对象放在ArrayList或通用List中,您可以将它绑定到Repeater。

如果您不需要业务逻辑层(另一个类),则应考虑将代码移至至少一个数据访问层(类),而不是在代码隐藏中执行任何操作。

所有这些建议仅适用于您的应用不重要的情况。 使用OO方法会增加代码,但如果您在显示信息之外做任何事情,那么最好从良好的OO架构(DAL和BLL,如果不是MVC)开始。