Как сопоставить класс сущности группы из столбца «имя группы» в NHibernate?

StackOverflow https://stackoverflow.com/questions/1367355

Вопрос

В моей базе данных есть таблица, которая выглядит примерно так:

create table Foo (
    Id             int identity       not null,
    Name           varchar(100)       not null,
    GroupName      varchar(100)       not null,
    constraint PK_Foo primary key (Id)
)

Теперь я хочу сопоставить эту таблицу с двумя классами сущностей следующим образом:

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; }
}

Возможно ли это с NHibernate?Я пытался выполнить поиск в сети и в документации NH, но я действительно не знаю, что искать - идеи для поисковых запросов будут оценены по достоинству.

Может быть, я смогу составить карту для FooGroup который использует специальный запрос HQL/SQL для выбора отдельных имен групп и другой специальный запрос для выбора соответствующего набора содержащихся элементов?

Это было полезно?

Решение

Я не думаю, что можно делать то, что вы хотите, исключительно в сопоставлении NHibernate...хотя кто-то другой может доказать мою неправоту :-)

OTOH, довольно легко определить прямое сопоставление вашей таблицы с:

class RawFooData 
{
    public virtual in Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual string GroupName { get; set; }
}

а затем обработайте это, чтобы получить нужные значения:

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);
}

Я думаю, вы обнаружите здесь проблемы с производительностью только в том случае, если имеете дело с очень большими объемами данных (например,10 тыс. строк и более).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top