Atualmente, estou usando o Entity Framework para meu acesso ao banco de dados, mas quero dar uma olhada no Dapper. Eu tenho aulas como esta:
public class Course{
public string Title{get;set;}
public IList<Location> Locations {get;set;}
...
}
public class Location{
public string Name {get;set;}
...
}
Assim, um curso pode ser ministrado em vários locais. O Entity Framework faz o mapeamento para mim, para que meu objeto Curso seja preenchido com uma lista de locais. Como eu faria isso com o Dapper, isso é possível ou eu tenho que fazer isso em várias etapas de consulta?
Respostas:
O Dapper não é um ORM completo, ele não lida com a geração mágica de consultas e coisas do tipo.
Para o seu exemplo específico, o seguinte provavelmente funcionaria:
Pegue os cursos:
Pegue o mapeamento relevante:
Pegue os locais relevantes
Mapeie tudo
Deixando isso para o leitor, você cria alguns mapas e percorre os cursos preenchendo os locais.
Ressalva o
in
truque irá funcionar se você tem menos de 2100 pesquisas (SQL Server), se você tiver mais você provavelmente vai querer alterar a consulta paraselect * from CourseLocations where CourseId in (select Id from Courses ... )
se isso é o caso, você pode muito bem arrancar todos os resultados de uma só vez utilizandoQueryMultiple
fonte
Como alternativa, você pode usar uma consulta com uma pesquisa:
Veja aqui https://www.tritac.com/blog/dappernet-by-example/
fonte
Não há necessidade de
lookup
dicionáriofonte
Eu sei que estou realmente atrasado para isso, mas há outra opção. Você pode usar QueryMultiple aqui. Algo assim:
fonte
Desculpe estar atrasado para a festa (como sempre). Para mim, é mais fácil usar um
Dictionary
, como Jeroen K , em termos de desempenho e legibilidade. Além disso, para evitar a multiplicação de cabeçalho entre locais , eu usoDistinct()
para remover possíveis dups:fonte
Algo está faltando. Se você não especificar cada campo
Locations
na consulta SQL, o objetoLocation
não poderá ser preenchido. Dê uma olhada:Usando
l.*
a consulta, eu tinha a lista de locais, mas sem dados.fonte
Não tenho certeza se alguém precisa, mas tenho uma versão dinâmica sem o Model para codificação rápida e flexível.
fonte