First / FirstOrDefault无法正常工作

时间:2013-02-05 17:57:46

标签: c# linq nhibernate

我正在使用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()我会得到我期望的所有内容,但我发现它毫无意义,因为只有一条记录包含该父记录。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

实际上你不需要Where ... First或default需要lambda表达式

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

因此,而不是Where,使用上面的语句