我正在使用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()
我会得到我期望的所有内容,但我发现它毫无意义,因为只有一条记录包含该父记录。
答案 0 :(得分:2)
尝试将.FirstOrDefault
直接移到.Where
子句之后:
.Where(x => x.Id == parentAId).FirstOrDefault()...
答案 1 :(得分:2)
实际上你不需要Where ... First或default需要lambda表达式
.FirstOrDefault(x => x.Id == parentAId).
因此,而不是Where,使用上面的语句