Каков рекомендуемый способ возврата из хранилища данных ad hoc (индивидуально для каждого конкретного случая), которые не соответствуют объектам модели или расширяют их?
Примером 101 было бы вездесущее приложение «здравствуйте»: система блогов. Предположим, вы хотите загрузить список публикаций, в которых запись содержит некоторую дополнительную информацию, которой нет в сущности Post. Допустим, это количество комментариев, а также дата и время последнего комментария. Это было бы очень тривиально, если бы вы использовали простой старый SQL и считывали данные непосредственно из базы данных. Как я должен сделать это оптимально, используя шаблон репозитория, если я не могу позволить себе загружать все коллекции Комментариев для каждого Поста, и я хочу сделать это одним попаданием в базу данных? Есть ли какой-либо обычно используемый шаблон для этой ситуации? Теперь представьте, что у вас есть довольно сложное веб-приложение, в котором каждой странице требуются немного разные пользовательские данные, а загрузка полных иерархий невозможна (производительность, требования к памяти и т. Д.).
Некоторые случайные идеи:
Добавить список свойств для каждой модели, которые могут быть заполнены пользовательскими данными.
Объекты модели подкласса для каждого конкретного случая и создание пользовательских считывателей для каждого подкласса.
Использование LINQ, составление специальных запросов и чтение анонимных классов.
Примечание: я недавно задал аналогичный вопрос , но он казался слишком общим и не привлек большого внимания.
Пример:
Основываясь на предложениях в ответах ниже, я добавляю более конкретный пример. Вот ситуация, которую я пытался описать:
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
}
Если я не буду делать ничего лишнего и использую готовый ORM, это приведет к n + 1 запросам или, возможно, одному запросу, загружающему все сообщения и комментарии. Но оптимально, я хотел бы иметь возможность просто выполнить один SQL, который бы возвращал одну строку для каждого поста, включая заголовок поста, тело и т. Д., А также количество комментариев и самую последнюю дату комментария в одном и том же. Это тривиально в SQL. Проблема в том, что мой репозиторий не сможет читать и вписывать данные этого типа в модель. Куда идут максимальные даты и количество?
Я не спрашиваю, как это сделать. Вы всегда можете сделать это каким-то образом : добавить дополнительные методы в хранилище, добавить новые классы, специальные объекты, использовать LINQ и т. Д., Но я думаю, мой вопрос заключается в следующем. Почему шаблон репозитория и разработка, основанная на правильной модели, получили такое широкое признание, но, тем не менее, они, похоже, не решают этот, казалось бы, очень распространенный и базовый случай.