Linq NHibernate获取/ThenFetch用于已加入的同级

Linq NHibernate获取/ThenFetch用于已加入的同级,linq,nhibernate,join,fetch,Linq,Nhibernate,Join,Fetch,我有以下(简化的)实体层次结构: RootClass ->DescriptorClass ->SomeChild->DescriptorClass ->SomeGrandChild 如果可能的话,我想在一个查询中获取所有内容 目前我有以下几点: Session.Query<RootClass>().Where(/*some expressions here*/) .Fetch(v => v.

我有以下(简化的)实体层次结构:

RootClass
->DescriptorClass
->SomeChild->DescriptorClass
           ->SomeGrandChild
如果可能的话,我想在一个查询中获取所有内容

目前我有以下几点:

Session.Query<RootClass>().Where(/*some expressions here*/)
                    .Fetch(v => v.DescriptorClass)
                    .Fetch(v => v.SomeChild).ThenFetch(v => v.SomeGrandChild)
                    .Fetch(v => v.SomeChild).ThenFetch(v => v.DescriptorClass);
Session.Query()。其中(/*此处的一些表达式*/)
.Fetch(v=>v.DescriptorClass)
.Fetch(v=>v.SomeChild)。然后Fetch(v=>v.some孙子)
.Fetch(v=>v.SomeChild);
它工作得很好,但是它在SomeChild上创建了一个带有两个连接的SQL查询。显然,我必须摆脱第二次抓取(v=>v.SomeChild),但我找不到如何做。 我试过:

Session.Query<RootClass>().Where(/*some expressions here*/)
                    .Fetch(v => v.DescriptorClass)
                    .Fetch(v => v.SomeChild).ThenFetch(v => v.SomeGrandChild)
                    .ThenFetch(v => v.DescriptorClass); //<- wrong, tries to find DescriptorClass on SomeGranchild
Session.Query()。其中(/*此处的一些表达式*/)
.Fetch(v=>v.DescriptorClass)
.Fetch(v=>v.SomeChild)。然后Fetch(v=>v.some孙子)
.ThenFetch(v=>v.DescriptorClass);//v、 描述符类)
.Fetch(v=>v.SomeChild)。然后Fetch(v=>v.some孙子)

.Fetch(v=>v.DescriptorClass)// 对于这种类型的查询,请切换到使用LINQ查询语法而不是lambdas,因为它提供了更多的控制,并且通常输出更高效、更干净的SQL

看看下面的示例,注意我是如何使用别名“c”多次引用客户实体的

var customers =
    (
        from c in session.Query<Customer>()
        from a in c.Addresses
        from pn in c.PhoneNumbers
        where c.Status == "Active"
                && a.City == "Dallas"
                && pn.AreaCode == "972"
        select c )
        .ToList();

对于这种类型的查询,请切换到使用LINQ查询语法而不是lambdas,因为它提供了更多的控制,并且通常输出更高效、更干净的SQL

看看下面的示例,注意我是如何使用别名“c”多次引用客户实体的

var customers =
    (
        from c in session.Query<Customer>()
        from a in c.Addresses
        from pn in c.PhoneNumbers
        where c.Status == "Active"
                && a.City == "Dallas"
                && pn.AreaCode == "972"
        select c )
        .ToList();
我得到:“调用'SelectMany'时类型推断失败”。很可能是因为“from”发出了“SelectMany”,但我只有一个SomeChild/DescriptorClass/Some孙子,而不是它们的集合。我得到了:“在调用“SelectMany”时类型推断失败”。很可能是因为“from”发出了“SelectMany”,但我只有一个SomeChild/DescriptorClass/some孙子,而不是它们的集合。
SELECT
    customer0_.CustomerId as Customer1_135_0_,
    customer0_.Status as Customer1_135_1_
FROM
    Customer customer0_
INNER JOIN
    CustomerAddresses customeraddr1_
        ON customer0_.CustomerId=customeraddr1_.CustomerId
INNER JOIN
    CustomerPhoneNumbers customerphon2_
        ON customer0_.CustomerId=customerphon2_.CustomerId
WHERE
    customer0_.Status='Active' /* @p0 */
    AND customeraddr1_.City = 'Dallas' /* @p1 */
    AND customerphon2_.AreaCode = '972' /* @p2 */;