3

我正在使用 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()我得到我期望的一切,但我发现它没有意义,因为应该只有一个记录与该父记录。

4

2 回答 2

3

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

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

所以代替 Where ,使用上面的语句

于 2013-02-05T18:06:57.467 回答
2

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

.Where(x => x.Id == parentAId).FirstOrDefault()...
于 2013-02-05T18:01:14.587 回答