1

3 テーブル:

  1. ParentTable: ParentID (ParentID = 5 があると仮定)
  2. ParentChildrenTable: ParentID、ChildrenID (ParentID = 5 の関係行が 3 つあると仮定)
  3. ChildrenTable: ChildrenID, ChildrenName (ParentID = 5 の 3 つの子があると仮定します。例: A、B、C)

Entity FrameworkとLinQを使用して、「ParentID = 5のすべての子を取得して名前を出力する」などのことをしようとしています

これは私が意味するものです:

Parent fifthParent = db.ParentTable.FirstOrDefault(p => p.ParentID == 5);

foreach (ParentChildren parentChildren in fifthParent.ParentChildren) // will iterate 3 times
{
    //get each child seperatly according
    foreach(Child child in parentChildren.Children)
    {
        //print A (on 1st iteration)
        //print B (on 2nd iteration)
        //print C (on 3rd iteration)
    }   
}

私が見る限り、それは 2 つの for ループであるはずですが、過去 2 時間はそれに苦労しています。これらのクエリの原理をまだ把握できないため、コード サンプルを提供していただければ幸いです。

4

4 に答える 4

2

SelectMany内部コレクションをフラット化するために使用できます。

Parent fifthParent = db.ParentTable.FirstOrDefault(p => p.ParentID == 5);

var children = fifthParent.ParentChildren.SelectMany(c=>c.Children)

foreach (Child parentChildren in children)
{
   //print children.
}
于 2013-08-15T19:09:24.240 に答える
1

私は逆に始めます:

foreach ( var child in db.ChildrenTable
    .Where( c => c.ParentChildren.Any( pc => pc.ParentID == 5 ) ) )
{
    var foo = child.Name // or whatever else
}
于 2013-08-15T19:10:34.307 に答える
1

これにより、すべてが結合され、フィルタリングされて、親の ID が 5 である子のみが返されます。

var childrenOfFifthParent = 
    from parent in context.ParentTable

    join parentChild in context.ParentChildrenTable on parent.ParentID
        equals parentChild.ParentID

    join child in context.ChildrenTable on parentChild.ChildID
        equals child.ChildID

    where parent.ParentID == 5
    select child;

次に、次のようなことができます。

foreach (var child in childrenOfFifthParent.ToList())
{
    // print the child
}
于 2013-08-15T19:40:21.987 に答える
1

クラスParentChildrenTableは次のようになります

public class ParentChildrenTable
{
  public int Id { get; set; }
  public int ParentId { get; set;}
  public int ChildId {get; set; }

  public virtual ParentTable Parent { get; set; }
  public virtual ChildrenTable Child { get; set; }
}

つまり、最初のループ内で、オブジェクトのChildプロパティにアクセスできます。ParentChildrenTable

foreach (ParentChildren parentChildren in fifthParent.ParentChildren) // will iterate 3 times
{
    ChildrenTable child = parentChildren.Child;

    //print A (on 1st iteration)
    //print B (on 2nd iteration)
    //print C (on 3rd iteration)
}

アップデート:

単一の LINQ クエリでこれを行うにはSelectMany、次のSelect呼び出しを使用できます。

var children = db.ParentTable.Where(p => p.ParentID == 5)
                             .SelectMany(p => p.Children)
                             .Select(pc => pc.Child);

または、子供たちから始めることもできます。

var children = db.ChildrenTable.Where(c => c.ParentChildren.Any(pc => pc.ParentId == 5));
于 2013-08-15T19:13:14.427 に答える