This question already has answers here:
NHibernate: Why does Linq First() force only one item in all child and grandchild collections with FetchMany()
                                
                                    (2个答案)
                                
                        
                                6年前关闭。
            
                    
我正在使用nhibernate,并且写了一个linq查询,它没有返回我期望的结果。

public ParentA()
{
    public virtual Id {get; set;}
    public virtual Name {get; set;}
    public virtual IList<ChildA> ChidrenA {get; set;}

   public ParentA()
   {
       ChidrenA = new List<ChildA>();
   }
}

public ChildA()
{
    public virtual Id {get; set;}
    public virtual Name {get; set;}
    public virtual IList<ChildB> ChidrenB {get; set;}
    public virtual ParentA ParenteA {get; set;}
   public ChildA()
   {
       ChidrenB = new List<ChildB>();
   }
}

public ChildB()
{
    public virtual Id {get; set;}
    public virtual Name {get; set;}
    public virtual ChildA {get; set;}
}


上面的代码是我的域名。流利的nhibernate是非常基础的,没有什么特别的事情,因此我没有将它包括在内。

我的查询是

base.unitOfWork.Session.Query<ParentA>()
  .Where(x => x.Id == parentAId)
  .FetchMany(x => x.ChildrenA)
  .ThenFetchMany(x => x.ChildrenB)
  .FirstOrDefault();


我期望发生什么

它将找到1或0个父记录。如果确实找到一条记录,它将渴望加载所有ChildrenA,然后加载所有ChildrenB。

怎么了

它找到1或0个父记录。然后,ChildrenA和ChildrenB仅记录1或0。

为什么只记录ChildrenA和ChildrenB的第一个发现记录?

如果将FirstToDefault()更改为.toList(),我将获得所有期望的结果,但我发现它毫无意义,因为该父记录应该只有一个记录。

最佳答案

尝试将.FirstOrDefault移到.Where子句之后:

.Where(x => x.Id == parentAId).FirstOrDefault()...

09-07 00:40