¿Cuál es la forma recomendada de devolver datos ad hoc (personalizado caso por caso) del repositorio que no se ajustan a ninguna entidad modelo o que se extienden un poco?Datos ad hoc y patrón de repositorio
El ejemplo 101 sería la aplicación de palabra omnipresente hello: un sistema de blog. Supongamos que desea cargar una lista de publicaciones donde la entrada de entrada contiene información adicional que no existe en la entidad de publicación. Digamos que es la cantidad de comentarios y la fecha y hora del último comentario. Esto sería muy trivial si uno estuviera usando el viejo SQL simple y leyendo datos directamente de la base de datos. ¿Cómo se supone que debo hacerlo de manera óptima utilizando el patrón de repositorio si no puedo pagar la colección completa de Comentarios para cada publicación, y quiero hacerlo en un solo hit de la base de datos? ¿Hay algún patrón comúnmente utilizado para esta situación? Ahora imagine que tiene una aplicación web moderadamente compleja donde cada página necesita datos personalizados ligeramente diferentes, y no es posible cargar jerarquías completas (rendimiento, requisitos de memoria, etc.).
Algunas ideas al azar:
añadir una lista de propiedades para cada modelo que podría ser poblada por los datos personalizados.
La subclase modela las entidades caso por caso y crea lectores personalizados para cada subclase.
Usa LINQ, redacta consultas ad hoc y lee clases anónimas.
Nota: He hecho una similar question recently, pero parecía ser demasiado general y no atrajo mucha atención.
Ejemplo:
Sobre la base de las sugerencias de respuestas a continuación, añado un ejemplo más concreto. Aquí está la situación que estaba tratando de describir:
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
}
Si no hago nada extra y utilizar un ORM de la plataforma, esto dará lugar a n + 1 consultas o, posiblemente, una consulta de carga todos los mensajes y comentarios . Pero de manera óptima, me gustaría poder ejecutar solo un SQL que devolvería una fila para cada publicación, incluido el título de la publicación, el cuerpo, etc. y el recuento de comentarios y la fecha de comentario más reciente en la misma. Esto es trivial en SQL. El problema es que mi repositorio no podrá leer y ajustar este tipo de datos en el modelo. ¿A dónde van las fechas máximas y los recuentos?
No estoy preguntando cómo hacer eso. Siempre puede hacerlo de alguna manera: agregue métodos extra al repositorio, agregue nuevas clases, entidades especiales, use LINQ etc., pero supongo que mi pregunta es la siguiente. ¿Cómo es posible que el patrón de repositorio y el desarrollo impulsado por el modelo apropiado sean tan ampliamente aceptados, pero aún así no parecen abordar este caso aparentemente tan común y básico?
Gracias por indicarme eso. He agregado un ejemplo concreto simple y más explicaciones. –