Como mapear uma classe de entidade de grupo a partir de uma coluna "nome do grupo" em Nibernate?
-
21-09-2019 - |
Pergunta
Eu tenho uma tabela no meu banco de dados parecendo mais ou menos assim:
create table Foo (
Id int identity not null,
Name varchar(100) not null,
GroupName varchar(100) not null,
constraint PK_Foo primary key (Id)
)
Agora eu quero mapear esta tabela em duas aulas de entidade como esta:
class Foo {
public virtual in Id { get; private set; }
public virtual string Name { get; set; }
public virtual Group Group { get; set; }
}
class FooGroup {
public virtual string Name { get; set; }
public virtual ISet<Foo> Foos { get; private set; }
}
Isso é possível com o Nibernate? Eu tentei pesquisar nos documentos Net e NH, mas realmente não sei o que procurar - idéias para consultas de pesquisa seriam apreciadas.
Talvez eu possa fazer um mapeamento para FooGroup
que usa uma consulta HQL/SQL personalizada para selecionar os nomes de grupos distintos e outra consulta personalizada para selecionar o conjunto apropriado de itens contidos?
Solução
Eu não acho que é possível fazer o que você quer puramente no mapeamento Nibernate ... embora eu possa ser provado errado por outra pessoa :-)
OTOH É muito fácil definir um mapeamento direto da sua mesa em:
class RawFooData
{
public virtual in Id { get; private set; }
public virtual string Name { get; set; }
public virtual string GroupName { get; set; }
}
E então processe isso para obter os valores que você deseja:
IEnumerable<FooGroup> groups = allRawFooData.Select(data => data.GroupName)
.Distinct()
.Select(name => new FooGroup()
{
Name = name
});
foreach(var group in groups)
{
group.Foos = allRawFooData.Where(data => data.GroupName == group.Name);
}
Acho que você encontrará apenas problemas de desempenho aqui se estiver lidando com grandes quantidades de dados (por exemplo, 10k linhas ou mais).