我正在使用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,然后加载所有Children B。
发生了什么
它查找1或0个父记录。然后,ChildrenA和ChildrenB只需要1或0条记录。
为什么只拿ChildrenA和ChildrenB的第一张唱片?
如果我将FirstToDefault()
更改为.toList()
,我会得到我所期望的一切,但我发现这毫无意义,因为应该只有一条记录具有该父记录。
实际上您不需要Where。。。第一个或默认值采用lambda表达式
.FirstOrDefault(x => x.Id == parentAId).
因此,使用上面的语句
尝试将.FirstOrDefault
直接移动到.Where
子句之后:
.Where(x => x.Id == parentAId).FirstOrDefault()...