Pet*_*ger 7 c# sql-server oop generics datatable
我正在努力将良好的数据库设计概念与良好的面向对象设计联系起来.
传统上,如果我想在转发器中显示新闻故事列表,我会使用以下内容:
<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>
Run Code Online (Sandbox Code Playgroud)
这里News.GetAllNews()返回一个DataTable,它只是存储过程返回的转储.写入存储过程是为了使用连接返回数据,因此它不止一个表的数据.
这样做的好处在于,在数据库中,存储过程可以查找谁从News表中存在的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>
Run Code Online (Sandbox Code Playgroud)
但是现在我遇到的问题是,我想要显示的某些值(如AddedByFullName)在News对象中不存在,因为它们不是显式设置的,而是从查找ID中检索到的.宾语.
我想返回对象而不是DataTables,但我不知道弥合这个差距的最佳方法.
我是否:
*在News类中为可以从数据库返回的与此数据相关的每个附加值创建其他属性?
*坚持使用DataTables来处理具有许多附加值的特定情况?
或者我完全走错了轨道!
您的选择受到您愿意用作数据访问的底层技术的限制。目前,VS 工具集和 .Net 框架支持多种替代方案:
DataTable对象。IQueryable<T>在代码中使用 LINQ 语法。从这些中,除了 ADO.Net 类型的数据集之外,所有类型的数据集都允许您按照您的要求指定导航关系,无论是急切加载还是延迟加载。在像您描述的情况下,使用这些技术的自然目的是在设计器中显式地建模新闻文章和作者之间的关系,并让框架处理加载适当数据并转换为适当类型的问题,最终意味着连接问题由应用程序数据访问层(框架)隐式处理,而不是由显式创建的存储过程处理。
技术的选择将波及代码中的各处,从如何获取数据到如何显示数据以及如何更新,这些技术都不能轻易互换。就我个人而言,我发现 LINQ to SQL 可以在功能和复杂性之间实现正确的平衡。