Mam problemy z łączeniem koncepcji dobrego projektowania baz danych z dobrym zorientowanym obiektowo projektem.Zwracanie danych z bazy danych w .NET: Zwrócić DataTable lub LIst <T>?
Tradycyjnie gdybym chciał, aby wyświetlić listę newsów w peryferyjnym, chciałbym użyć czegoś takiego:
<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>
Tutaj News.GetAllNews() zwraca DataTable, który jest po prostu dump z tego, co procedura składowana zwraca. Procedura przechowywana jest zapisywana w celu zwrócenia danych przy użyciu sprzężeń, więc jest to więcej niż jedna wartość tabel.
Ma to tę zaletę, że w bazie procedura przechowywana może wyszukać którzy dodawali historię wiadomości z AddedByID że istnieje w Aktualności stole i zwróci osobom pełną nazwę jako AddedByFullName wartości zwracanej .
Jednak gdy próbuję i upuść używania DataTable i zamiast wrócić listę obiektów Wiadomości, mam następujące:
<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>
Ale teraz pozostaje mi się z problemem, że pewne wartości, które Chcę wyświetlić (podobnie jak AddedByFullName) nie istnieją w obiekcie News, ponieważ nie są one czymś jawnie ustawionym, ale nie są pobierane z identyfikatora odnośnika w obiekcie.
Chciałbym zwrócić obiekty zamiast DataTables, ale nie wiem, jak najlepiej wypełnić tę lukę.
Do I:
* Tworzenie dodatkowych właściwości w Aktualności klasy dla każdej dodatkowej wartości, która może być zwrócony z bazy danych w odniesieniu do tych danych?
* Trzymaj z DataTables dla konkretnych przypadków, gdy jest dużo dodatkowych wartości?
Czy jestem całkowicie na niewłaściwym torze!
Dzięki za twój wkład Remus - Słyszałem, że MS zatrzymało rozwój LINQ na SQL na rzecz Entity Framework. Czy to prawda, a jeśli tak, czy zachęcałbyś do nowych rozwiązań wykorzystujących tę technologię? –
@Peter: Nie jestem już ze stwardnieniem rozsianym, tak naprawdę nie wiedziałbym więcej niż jest publiczna wiedza. Czy to prawda, że EF jest zalecaną metodą w przyszłości, ale biorąc pod uwagę przytłaczające przyjęcie LINQ do SQL w porównaniu z EF, byłabym zaskoczona, widząc to całkowicie porzucone. –
Obecnie używam LINQ2SQL i cieszę się nim w projekcie .net 3.5. Mój następny duży projekt będzie korzystał z .net 4.0, więc będę używać Entity Framework 4.0 –