LINQ to NHibernate不与子类JOIN,而QueryOver则

时间:2014-08-07 09:57:14

标签: nhibernate linq-to-nhibernate queryover

我有这个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查询来获取子类的数据吗?

1 个答案:

答案 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