Ich kämpfe mit der Überbrückung der Konzepte von gutem Datenbankdesign mit gutem objektorientiertem Design.Rückgabe von Daten aus der Datenbank in .net: Rückgabe eines DataTable oder LIst <T>?
Traditionell wenn ich eine Liste von Nachrichten in einem Repeater angezeigt werden wollte, würde ich so etwas wie:
<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>
Hier News.GetAllNews() gibt ein Datatable, das nur ein dump von was die gespeicherte Prozedur zurückgibt. Die gespeicherte Prozedur wird geschrieben, um Daten mithilfe von Joins zurückzugeben, sodass mehr als eine Tabelle Daten enthält.
Dies hat den Vorteil, dass in der Datenbank die gespeicherte Prozedur nachschlagen können, die die Nachrichten Geschichte aus dem AddedByID hinzugefügt, die Nachrichten Tabelle existiert in der und geben die Personen vollständigen Namen als AddedByFullName Wert zurückgegeben .
Allerdings, wenn ich die Verwendung eines Datatable versuchen und fallen und stattdessen eine Liste der Nachrichten Objekte zurück, erhalte ich folgendes:
<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>
Aber jetzt mit dem Problem, das ich bin gelassen, dass bestimmte Werte, die Ich möchte (wie AddedByFullName) nicht in dem News-Objekt vorhanden sein, da sie nicht explizit festgelegt sind, sondern von einer Nachschlag-ID in dem Objekt abgerufen werden.
Ich möchte Objekte lieber als DataTables zurückgeben, aber ich kenne nicht den besten Weg, diese Lücke zu überbrücken.
Do I:
* Erstellen Sie zusätzliche Eigenschaften in der Nachrichten Klasse für jeden zusätzlichen Wert, der aus der Datenbank in Bezug auf diese Daten zurückgeführt werden kann?
* Stick mit DataTables für bestimmte Fälle, wo das viele zusätzliche Werte sind?
Oder bin ich einfach total auf dem Holzweg!
Vielen Dank für Ihre Eingabe Remus - Ich habe gehört, dass MS die Entwicklung von LINQ to SQL zugunsten des Entity Framework gestoppt hat. Stimmt das und wenn ja, würden Sie neue Entwicklungen mit dieser Technologie fördern? –
@Peter: Ich bin nicht mehr mit MS, also würde ich nicht wirklich mehr wissen als ist öffentlich bekannt. Es stimmt, dass EF in der Zukunft der empfohlene Weg ist, aber angesichts der überwältigenden Akzeptanz von LINQ to SQL im Vergleich zu EF würde ich davon absehen, es komplett aufgegeben zu sehen. –
Ich benutze und genieße LINQ2SQL für ein .net 3.5 Projekt. Mein nächstes großes Projekt wird .net 4.0 verwenden, also werde ich das Entity Framework 4.0 verwenden –