Quando si eseguono query sui dati con Entity Framework è molto comune utilizzare il metodo Include. L’utilizzo di Include(…), ha sicuramente due svantaggi:
- vengono interrogati campi che probabilmente non ci servono (tutti)
- quasi sicuramnte dovremo mappare le nostre entità su un altro modello o DTO
Entity Framework generà in automatico la query delle join, ed allo stesso modo estrarrà tutti i campi in join tra le N tabelle.
Una possibile soluzione può essere quella di creare delle proiezioni estraendo solo la parte di dati che ci interessa. Ovviamente questa soluzione è sicuramente valida, ma comporta di dover scrivere manualmente tutte le proiezioni che ci servono.
Un modo per poter risolvere il problema è quello di utilizzare Automapper: forse non tuti sanno che Automapper ha un metodo chiamato ProjectTo(…) che può essere facilmente integrat all’interno delle query:
var posts = await mapper.ProjectTo<PostDto>(dbContext.Posts, null).ToListAsync();
Il metodo consente di indicare all’esecuzione di IQueryable generata, che dovrà essere effettuata una proiezione, proprio come se l’avessimo indicata manualmente:
SELECT [p].[Id], [p].[Title], [b].[Id], [b].[Name], [c].[Id] FROM [Posts] AS [p] INNER JOIN [Blogs] AS [b] ON [p].[BlogId] = [b].[Id] LEFT JOIN [Comments] AS [c] ON [p].[Id] = [c].[PostId] ORDER BY [p].[Id], [b].[Id]
Questo approccio consente di scrivere query anche piuttosto complesse, rendendole facilmente leggibili e soprattutto performanti.