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;}
}

上記のコードは私のドメインです。Fluent nhibernate は非常に基本的なものであり、特別なことは何も行われていないため、含めていません。

私が持っているクエリは

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

私が期待したこと

1 つまたは 0 の親レコードが見つかります。1 つのレコードが見つかった場合は、すべての ChildrenA を熱心にロードし、次にすべての ChildrenB をロードします。

何が起こっている

1 個または 0 個の親レコードが見つかります。次に、ChildrenA と ChildrenB のレコードを 1 つまたは 0 つだけ取得します。

ChildrenA と ChildrenB の最初に見つかったレコードのみを取得するのはなぜですか?

に変更FirstToDefault()する.toList()と、期待どおりのものがすべて得られますが、その親レコードを持つレコードは 1 つだけであるため、無意味であることがわかります。

4

2 に答える 2

3

実際には Where ...First または default takes ラムダ式は必要ありません

  .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 に答える