Linq到NHibernate会产生不必要的连接
我使用的是NHibernate 3.2.1。下面的查询Linq到NHibernate会产生不必要的连接,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,我使用的是NHibernate 3.2.1。下面的查询 return session.Query<TmTranslation>() .Where(x => x.TranslationUnit.Document.Job == job) .OrderBy(x => x.Id) .ToList(); 我的映射: public class TmTranslationMap : ClassMap&
return session.Query<TmTranslation>()
.Where(x => x.TranslationUnit.Document.Job == job)
.OrderBy(x => x.Id)
.ToList();
我的映射:
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();
}
}
正如您所看到的,其中一个连接是无用的,只会使查询运行得更慢。是否有任何方法可以使查询不使用Linq生成不必要的联接
谢谢。LINQ to NHibernate提供程序似乎无法将关联从目标表导航到源表,并且每次遇到此类关联时都会生成单独的联接:一个用于Translation->TranslationUnit,另一个用于TranslationUnit to Document 诀窍是帮助提供者向另一个方向导航:文档->转换单元->翻译,如下所示:
var items=(from doc in session.Query<Document>()
from tu in doc.TranslationUnits
from translation in tu.Translations
where doc.Job ==job
orderby translation.Id
select translation).ToList();
LINQ to NHibernate提供程序似乎无法将关联从目标表导航到源表,并且每次遇到此类关联时都会生成一个单独的联接:一个用于Translation->TranslationUnit,另一个用于TranslationUnit到Document 诀窍是帮助提供者向另一个方向导航:文档->转换单元->翻译,如下所示:
var items=(from doc in session.Query<Document>()
from tu in doc.TranslationUnits
from translation in tu.Translations
where doc.Job ==job
orderby translation.Id
select translation).ToList();
@Daniel使用MappingsId更新了您是否得到任何答案或解决方案,我跨越了相同的问题。@ValidfroM不幸的是,我没有,除了还原到QueryOver API。@Daniel使用MappingsId更新了您是否得到了任何答案或解决方案,我跨越了相同的问题。@ValidfroM不幸的是,我没有,除了还原到QueryOver API。
SELECT translatio2_.Id as Id1_, translatio2_.Text as Text1_, translatio2_.TmTranslationUnitId as TmTransl3_1_
FROM [Document] AS document0_ INNER JOIN
TmTranslationUnit AS translatio1_ ON document0_.Id = translatio1_.DocumentId INNER JOIN
TmTranslation AS translatio2_ ON translatio1_.Id = translatio2_.TmTranslationUnitId
WHERE (document0_.JobId = @p0)
ORDER BY translatio2_.Id