我有这个QueryOver查询:
var result = session.QueryOver<TopicSelection>()
.Where(x => x.LacId == lac && x.RemoveDate == null)
.List();
简而言之:TopicSelection是一个基类,一个子类具有多对一属性,lazy = false和fetch = join。
当我使用QueryOver时,NHibernate创建了很好的连接并从多对一表中获取了额外的数据。哪个好,一个查询发出,我得到了一切。
当我将它改为LINQ to NHibernate时:
var result = session.Query<TopicSelection>()
.Where(x => x.LacId == lac && x.RemoveDate == null)
.ToList();
执行的查询不包含JOIN。更重要的是,每次需要多对一财产时,都会发出额外的选择。
NHibernate中的LINQ是一个错误吗?我可以指示LINQ to NHibernate查询来获取子类的数据吗?
答案 0 :(得分:1)
您所遇到的是一个&#34; NHibernate LINQ实现&#34;就像今天一样。我们可以有效地做两件事。
如果我们可以调整查询以请求子类,或者{em> {{{>} {{ 1}},我们可以使用many-to-one
TopicSelection
第二种方法甚至更好。几乎在任何情况下我都会建议。即而不是.Fetch()
的任何多对一映射 - 让我们使用:
像这样更改类映射:
var result = session
//.Query<TopicSelection>()
.Query<TopicSelectionSubClass>()
.Where(x => x.LacId == lac && x.RemoveDate == null)
.Fetch(x => x.Category ) // the many-to-one property joined
.ToList();
这会将1 + N选择更改为1 + 1 (或1 + 2)。来自docs的小引用:
NHibernate可以有效地使用批量提取,也就是说,如果访问一个代理(或集合),NHibernate可以加载几个未初始化的代理。批量提取是延迟选择提取策略的优化。有两种方法可以调整批量提取:在类和集合级别上。
更容易理解批量提取类/实体。想象一下,您在运行时遇到以下情况:您在一个ISession中加载了25个Cat实例,每个Cat都有一个对其所有者的引用,一个Person。 Person类使用代理映射,lazy =&#34; true&#34;。如果您现在遍历所有猫并在每个猫上调用cat.Owner,NHibernate将默认执行25个SELECT语句,以检索代理所有者。
了解更多here