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?

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top