Я использую NHibernate 3.2.1. Следующий запрос
return session.Query<TmTranslation>()
.Where(x => x.TranslationUnit.Document.Job == job)
.OrderBy(x => x.Id)
.ToList();
создает этот SQL:
select tmtranslation.id,
tmtranslation.text,
tmtranslation.fk_id_translation_unit
from "TRANSLATION" tmtranslation
inner join "TRANSLATION_UNIT" tmunit
on tmtranslation.fk_id_translation_unit = tmunit.id
inner join "TRANSLATION_UNIT" tmunit2
on tmtranslation.fk_id_translation_unit = tmunit2.id
inner join "DOCUMENT" tmdocument
on tmunit2.fk_id_document = tmdocument.id
where tmdocument.fk_id_job = 174
order by tmtranslation.id asc
Мое сопоставление:
public class TmTranslationMap : ClassMap<TmTranslation>
{
public TmTranslationMap()
{
Table("\"TRANSLATION\"");
LazyLoad();
Id(x => x.Id, "id").GeneratedBy.HiLo("hilo", "hilo_translation", "200");
Map(x => x.Text).Column("text");
References<TmTranslationUnit>(x => x.TranslationUnit, "fk_id_translation_unit").Cascade.None();
DynamicUpdate();
}
}
public class TmTranslationUnitMap: ClassMap<TmTranslationUnit>
{
public TmTranslationUnitMap()
{
Table("\"TRANSLATION_UNIT\"");
LazyLoad();
Id(x => x.Id, "id").GeneratedBy.HiLo("hilo", "hilo_translation_unit", "200");
HasMany(x => x.Translations).Inverse().KeyColumn("fk_id_translation_unit").Cascade.None();
References<TmDocument>(x => x.Document, "fk_id_document").Not.Nullable().Cascade.None();
}
}
public class TmDocumentMap : ClassMap<TmDocument>
{
public TmDocumentMap()
{
Table("\"DOCUMENT\"");
LazyLoad();
Id(x => x.Id, "id").GeneratedBy.HiLo("hilo", "hilo_document", "50");
References<TmJob>(x => x.Job, "fk_id_job").Not.Nullable();
HasMany(x => x.TranslationUnits).Inverse().KeyColumn("fk_id_document").Cascade.SaveUpdate();
}
}
Как видите, одно из JOIN является бесполезным и только замедляет выполнение запроса. Можно ли как-нибудь сделать так, чтобы запрос не создавал ненужных JOIN с использованием Linq?
Спасибо.