Jaki jest zalecany sposób zwracania danych z repozytorium ad hoc (niestandardowe przypadek po przypadku), które nie pasują do żadnych encji modelowych lub które rozszerzają niektóre?Dane ad hoc i wzorzec repozytorium
Przykładem 101 byłaby wszechobecna aplikacja hello word: system blogów. Załóżmy, że chcesz załadować listę wpisów, w których wpis po wpisie zawiera dodatkowe informacje, które nie istnieją w jednostce Post. Powiedzmy, że jest to liczba komentarzy oraz data i czas ostatniego komentarza. Byłoby to bardzo trywialne, gdyby ktoś używał zwykłego starego SQL i odczytał dane bezpośrednio z bazy danych. Jak mam to zrobić optymalnie przy użyciu wzorca repozytoriów, jeśli nie mogę pozwolić sobie na załadowanie wszystkich kolekcji komentarzy do każdego postu i chcę to zrobić w jednym uderzeniu bazy danych? Czy istnieje jakaś powszechnie stosowana wzorzec dla tej sytuacji? Teraz wyobraź sobie, że masz umiarkowanie złożoną aplikację internetową, w której każda strona wymaga nieco innych niestandardowych danych, a ładowanie pełnych hierarchii nie jest możliwe (wydajność, wymagania dotyczące pamięci itp.).
Niektóre losowe pomysłów:
dodać listę właściwości do każdego modelu, który mógłby być zaludnione przez dane niestandardowych.
Podsumowuje elementy modelu w każdym przypadku i tworzy niestandardowe czytniki dla każdej podklasy.
Używaj LINQ, komponuj zapytania ad hoc i czytaj anonimowe klasy.
Uwaga: Poprosiłem o numer similar question recently, ale wydawało mi się, że jest zbyt ogólny i nie przyciąga zbyt wiele uwagi.
Przykład:
oparciu o sugestie w odpowiedzi poniżej, dodaję bardziej konkretny przykład. Oto sytuacja starałem się opisać:
IEnumarable<Post> posts = repository.GetPostsByPage(1);
foreach (Post post in posts)
{
// snip: push post title, content, etc. to view
// determine the post count and latest comment date
int commentCount = post.Comments.Count();
DateTime newestCommentDate = post.Comments.Max(c => c.Date);
// snip: push the count and date to view
}
Jeśli nie robić nic dodatkowego i używać off ORM półki, doprowadzi to do n + 1 zapytań lub ewentualnie jedno ładowanie kwerendy wszystkie wpisy i komentarze . Ale optymalnie, chciałbym móc po prostu wykonać jeden SQL, który zwróciłby jeden wiersz dla każdego postu, włącznie z tytułem, treścią itd. Oraz liczbą komentarzy i ostatnią datą komentarza w tym samym. To jest banalne w SQL. Problem polega na tym, że moje repozytorium nie będzie w stanie odczytać i dopasować tego typu danych do modelu. Gdzie idą maksymalne terminy i liczby?
Nie pytam, jak to zrobić. Zawsze możesz to zrobić jakoś: dodaj dodatkowe metody do repozytorium, dodaj nowe klasy, specjalne byty, użyj LINQ itp., Ale domyślam się, że moje pytanie jest następujące. Jak to się dzieje, że schemat repozytorium i właściwy rozwój oparty na modelach są tak szeroko akceptowane, ale nie wydają się zajmować tym pozornie bardzo powszechnym i podstawowym przypadkiem.
Dziękuję za skierowanie mnie do tego. Dodałem prosty konkretny przykład i więcej wyjaśnień. –