在.net中从数据库返回数据:返回一个DataTable或LIst <T>?

我很努力地将良好的数据库设计理念与良好的面向对象的设计结合起来。

传统上,如果我想在中继器中显示新闻故事列表,我会使用类似以下内容的内容:

<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 ,它只是存储过程返回的转储。 存储过程被写入以通过使用连接返回数据,所以它的数据值不止一个表格。

这样做的好处在于,在数据库中,存储过程可以查找由News表中存在的AddedByID添加新闻故事的人员 ,并返回人员全名,作为返回的AddedByFullName值。

但是,如果我尝试放弃DataTable的使用,而是返回News对象的列表,我会得到以下结果:

<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目的。

我想返回对象而不是DataTable,但我不知道弥合这种差距的最佳方法。

我是否:
*在News类中为每个可以从数据库返回的与该数据相关的附加值创建其他属性?
*对于有很多附加值的特定情况,坚持使用DataTables

还是我完全错误的轨道上!


您的选择受到您愿意用作数据访问的基础技术的限制。 目前,VS工具集和.Net框架支持多种选择:

  • 经典的ADO.Net 2.0。 在代码中设计Typed数据集和DataTable对象。
  • LINQ to SQL。 在LINQ O / R Design modeler中设计,在代码中使用IQueryable<T>和LINQ语法。
  • 实体框架。 在实体数据建模器中设计,在代码中使用实体。
  • 第三方的ORM工具,如NHibernate。 每个人都有自己特定的设计者和代码对象类型。
  • 除此之外,除了ADO.Net类型的数据集之外,您可以像您要​​求的那样指定导航关系,无论是急切还是懒惰地加载。 在你描述与这些技术有关的自然兴趣的情况下,将在设计者中明确地模拟新闻文章和作者之间的关系,并让框架处理将适当数据加载到适当类型的问题,最终意义连接问题由应用程序数据访问层(框架)隐式处理,而不是由显式创建的存储过程处理。

    技术的选择会波及到代码中的每一处,从获取数据的方式到显示方式以及更新方式,这些技术都不易互换。 就我个人而言,我发现权力和复杂性的适当平衡在于LINQ to SQL。


    你可以试试这个,也许不是更好的解决方案:

    void ShowNews()
    {   
        User[] usersConcerned = News.GetAllUsersLinkedWithNews(); //only return the users concerned by the news
        List<News> news = News.GetAllNews();
        foreach(News item in news)
        {
           item.AddedByUser = usersConcerned.FirstOrDefault(u=>u.Id == item.AddedByUserID);
        }
        rptNewsStories.DataSource = news ; 
        rptNewsStories.DataBind();
    }
    

    好问题:

    您可以采取几种方法:

  • 您可以在中继器的绑定事件中检索需要的附加数据,并将其填充到每个返回的新闻记录的“占位符”中。 由于额外的查询,这具有性能问题,但它会起作用。

  • 如果可能,我会修改新闻对象以包含附加信息,或者创建一个从新闻对象继承的对象,该对象中包含附加信息或属性。

  • 希望这有助于:-) +1

    编辑/评论:我认为你在设计中看到的摩擦是你不承认你的新闻对象与我称之为作者/贡献者之间的“有”关系。 您在查询中进行的连接只是掩盖了对象模型中缺乏关系的情况。

    链接地址: http://www.djcxy.com/p/43597.html

    上一篇: Returning data from database in .net: Return a DataTable or LIst<T>?

    下一篇: Reduce number of config files to as few as possible