传统上,如果我想在转发器中显示新闻故事列表,我会使用以下内容:
<script runat="server"> void ShowNews() { rptNewsStories.DataSource = News.GetAllNews(); // Returns a DataTable rptNewsStories.DataBind(); } </script> <asp:Repeater id="rptNewsStories" runat="server"> <ItemTemplate> <div> <span class="Title"><%# Eval("Title")"%> (<%# Eval("Location")"%>)</span> <p> <%# Eval("Summary")"%> </p> <ul> <li>Added by: <%# Eval("AddedByFullName")%></li> <li>Added on: <%# Eval("AddedOn")%></li> </ul> </div> </ItemTemplate> </asp:Repeater>
这里News.GetAllNews()返回一个DataTable,它只是存储过程返回的转储.写入存储过程是为了使用连接返回数据,因此它不止一个表的数据.
这样做的好处在于,在数据库中,存储过程可以查找谁从新闻表中存在的AddedByID添加新闻故事,并返回人员全名作为返回的AddedByFullName值.
但是,如果我尝试删除DataTable的使用而返回一个News对象的List,我会得到以下结果:
<script runat="server"> void ShowNews() { rptNewsStories.DataSource = News.GetAllNews(); // Returns a List<News> rptNewsStories.DataBind(); } </script> <asp:Repeater id="rptNewsStories" runat="server"> <ItemTemplate> <div> <span class="Title"><%# Eval("Title")"%> (<%# Eval("Location")"%>)</span> <p> <%# Eval("Summary")"%> </p> <ul> <li>Added by: <!-- Here there is only a AddedByUserID,not an AddedByFullName value --></li> <li>Added on: <%# Eval("AddedOn")%></li> </ul> </div> </ItemTemplate> </asp:Repeater>
但是现在我遇到的问题是,我想要显示的某些值(如AddedByFullName)在News对象中不存在,因为它们不是显式设置的,而是从查找ID中检索到的.宾语.
我想返回对象而不是DataTables,但我不知道弥合这个差距的最佳方法.
我是:
*在News类中为可以从数据库返回的与此数据相关的每个附加值创建其他属性?
*坚持使用DataTables来处理具有许多附加值的特定情况?
或者我完全走错了轨道!
解决方法
>经典ADO.Net 2.0.在代码中设计Typed datasets和DataTable
对象.
> LINQ to SQL.在LINQ O/R Design modeler中设计,在代码中使用IQueryable<T>
和LINQ语法.
> Entity Framework.在Entity Data modeler中进行设计,在代码中使用实体.
>第三方ORM工具,如NHibernate.每个工具都有自己的特定设计器和代码对象类型.
除此之外,所有ADO.Net类型的数据集都允许您指定导航关系,就像您要求的那样,急切地或懒惰地加载.在你描述这些技术的自然兴趣的情况下,将在设计者中明确地模拟新闻文章和作者之间的关系,并让框架处理加载适当数据和适当类型的问题,最终意义连接问题由应用程序数据访问层(框架)隐式处理,而不是由显式创建的存储过程处理.
技术的选择将在您的代码中无处不在,从您获取数据的方式到显示方式以及更新方式,这些技术都不容易互换.就个人而言,我发现权力和复杂性的正确平衡是LINQ to sql.