查询4级深层列表层次结构

时间:2016-01-18 12:57:41

标签: c# entity-framework linq

我有这样的层次结构:

public class BaseClass
{
    public virtual List<FirstChild> Childs { get; set; }
}
public class FirstChild
{
    public virtual List<SecondChild> Childs { get; set; }
}
public class SecondChild
{
    public virtual List<ThirdChild> Childs { get; set; }
}
public class ThirdChild
{
    public List<FourthCild> Childs { get; set; }
}
public class FourthCild
{
    public int SomeProperty { get; set; }
}

要从BaseClass实例获取特定的ThirdChild,我尝试使用类似的东西:

using (MyDb context = new MyDb())
{
    context.BaseClass.Where(u => u.username == username).FirstOrDefault()
    .FirstChild.Where(f => f.SomeId == idReceived).FirstOrDefault()
    .SecondChild.Where(s => s.MyProperty.Identifier == identifierReceived).FirstOrDefault()
    .ThirdChild.Where(t => t.Identifier == thirdIdentifier).FirstOrDefault();
}

这是最短/最干净的方式吗?我认为有一种更简单的方法,但我是Entity Framework的新手。我现在没有任何数据来测试这个,因为我还在建模它。上下文类如下所示:

public class MyDb: DbContext
{
    public DbSet<BaseClass> Base { get; set; }
    public DbSet<FirstChild> First { get; set; }
    public DbSet<SecondChild> Second { get; set; }
    public DbSet<ThirdChild> Third { get; set; }
}

2 个答案:

答案 0 :(得分:1)

我认为你可能会略微向后看,你的多个'FirstOrDefault'调用可能会导致一些性能问题,因为每个人都会遇到数据库。

也许你需要更像是:

Tournament

即。如果您直接编写SQL,请从ThirdChild中选择,加入层次结构并在where子句中进行过滤,以此类推思考。

注意 - 这假定每个父母与其子女之间存在一对多的关系。

答案 1 :(得分:1)

您正在定义one-to-many关系。您已在一个方面提供了所谓的导航属性,但您还需要在多个方面提供相似内容,例如

public class BaseClass
{
    public virtual List<FirstChild> Childs { get; set; }
}
public class FirstChild
{
    public virtual BaseClass Parent { get; set; }
    public virtual List<SecondChild> Childs { get; set; }
}
public class SecondChild
{
    public virtual FirstChild Parent { get; set; }
    public virtual List<ThirdChild> Childs { get; set; }
}
public class ThirdChild
{
    public virtual SecondChild Parent { get; set; }
    public List<FourthCild> Childs { get; set; }
}
public class FourthCild
{
    public virtual ThirdChild Parent { get; set; }
    public int SomeProperty { get; set; }
}

然后,您可以直接从您想要的级别开始查询

context.Third.Where(t => t.Identifier == thirdIdentifier
    && t.Parent.MyProperty.Identifier == identifierReceived
    && t.Parent.Parent.SomeId == idReceived
    && t.Parent.Parent.Parent.username == username)