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 */;