C# 查询4级深度列表层次结构

C# 查询4级深度列表层次结构,c#,entity-framework,linq,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<Thi

我有这样的层次结构:

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; }
}
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();
}
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; }
}
这是最短/最干净的方法吗?我认为有一种更简单的方法,但我对实体框架还不熟悉。我现在没有任何数据来测试这个,因为我还在建模。上下文类如下所示:

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

我认为您可能会稍微倒退,您的多个“FirstOrDefault”调用可能会导致一些性能问题,因为每个调用都会影响数据库

也许你需要更像这样的东西:

var target = (from tc in context.Third
   where tc.Identifier == thirdIdentifier
   && tc.SecondChild.MyProperty.Identifer == identifierReceived
   && tc.SecondChild.FirstChild.someId == idReceived
   && tc.SecondChild.FirstChild.Base.username == username
   select tc).FirstOrDefault();
i、 与直接编写SQL时的做法类似,从ThirdChild中选择,加入层次结构并在where子句中进行筛选

注意-这假定每个父级及其子级之间存在一对多关系。

您正在定义一对多关系。您已经在一侧提供了所谓的导航属性,但是您还需要在多个一侧提供类似的属性,如下所示

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

在每个级别定义并使用父导航属性。@在您的示例中,其中两个布尔检查是赋值运算符。我如何从第三个子项引用第二个子项?使用虚拟父类型属性?@zackery.fix谢谢。现在在VB.net和C之间切换。键入…@cfrozendath时出现持续错误-假设您的DB模型,SecondChild有一个ThirdChild集合,那么我希望您的ThirdChild有一个SecondChild“parent”属性,所以是的,如您所述,假设先设置EF代码。最后一件事,您在最后一个where条件后缺少一个select tc,否则VS会抱怨查询主体必须以select语句结束。我选择您的答案,因为您花时间直接用代码解释导航属性。