我有这样的层次结构:
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; }
}
答案 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)