Nhibernate, я могу улучшить свою КАРТИНУ или Запрос - PullRequest
1 голос
/ 07 апреля 2010

возьмите этот простой пример

Класс персонала, который ссылается на другие экземпляры класса персонала

public class Staff
{
    public Staff()
    {
        Team = new List<Staff>();
    }

    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Staff> Team { get; set; }
    public virtual Staff Manager { get; set; }
}

Свободное отображение

public class StaffMap : ClassMap<Staff>
{
    public StaffMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        References(x => x.Manager).Column("ManagerId");
        HasMany(x => x.Team).KeyColumn("ManagerId").Inverse();
    }
}

Теперь я хочу выполнить запрос, который загрузит весь персонал и нетерпеливо загрузит менеджера и членов команды. Это то, что я придумал

IList<Staff> resutls = 
    session.CreateCriteria<Staff>()
    .SetFetchMode("Team", FetchMode.Eager)
    .SetResultTransformer(Transformers.DistinctRootEntity)
    .List<Staff>();

однако SQL (делает то, что я хочу) имеет дублирующиеся столбцы, 2 team2_.ManagerId и 2 team2_.Id

SELECT 
this_.Id as Id0_1_, 
this_.Name as Name0_1_, 
this_.ManagerId as ManagerId0_1_, 
team2_.ManagerId as ManagerId3_, 
team2_.Id as Id3_, 
team2_.Id as Id0_0_, 
team2_.Name as Name0_0_, 
team2_.ManagerId as ManagerId0_0_ 
FROM [SelfRef].[dbo].[Staff]
this_ left outer join 
[SelfRef].[dbo].[Staff] team2_ 
on this_.Id=team2_.ManagerId

Вопрос в том, должно ли это происходить?

я что-то не так сделал в запросе или на карте?

или это особенность HHib, которую я использую (версия 2.1.0.4000)?

большое спасибо заранее

1 Ответ

1 голос
/ 07 апреля 2010

Да, это нормально, так как вы используете его дважды как внешний ключ. Это будет оптимизировано вашей СУБД. Я обычно игнорирую часть сгенерированных запросов SELECT, так как они не влияют на производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...