1

3 表:

  1. ParentTable: ParentID (假设有一个 ParentID = 5)
  2. ParentChildrenTable:ParentID、ChildrenID (假设有3个ParentID = 5的关系行)
  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

你的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 回答
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 回答