我正在使用带有SQL Server 2012数据库的Entity Framework 5和以下类结构。结构有五个层次:
主题>主题> SubTopic>事实>答案
我需要的是能够在向我提供SubjectId时获得Fact对象列表及其答案。我关注的是性能以及LINQ查询的深度。
以下是课程:
public partial class Subject {
public Subject() { this.Topics = new List<Topic>(); }
public int SubjectId { get; set; }
public string Name { get; set; }
public virtual ICollection<Topic> Topics { get; set; }
}
public partial class Topic {
public Topic() { this.SubTopics = new List<SubTopic>(); }
public int TopicId { get; set; }
public string Name { get; set; }
public int SubjectId { get; set; }
public virtual Subject Subject { get; set; }
public virtual ICollection<SubTopic> SubTopics { get; set; }
}
public partial class SubTopic {
public SubTopic() { this.Facts = new List<Fact>(); }
public int SubTopicId { get; set; }
public string Name { get; set; }
public int TopicId { get; set; }
public virtual Topic Topic { get; set; }
public virtual ICollection<Fact> Facts { get; set; }
}
public class Fact {
public Fact() { this.Answers = new List<Answer>(); }
public int FactId { get; set; }
public int FactStatusId { get; set; }
public string Title { get; set; }
public int SubTopicId { get; set; }
public virtual SubTopic SubTopic { get; set; }
public virtual ICollection<Answer> Answers { get; set; }
}
到目前为止,我所有的LINQ查询都非常简单。例如,当我知道subTopicId时,我用这个查询来获取事实:
var facts = _factsRepository.GetAll()
.Where(a => a.SubTopicId == subTopicId)
.Include(a => a.Answers)
.ToList();
现在我有了新的要求,我不知道如何获取我需要的数据。我需要的是获取属于给定SubjectId的事实列表和答案。
我很感激一些建议并希望得到一些示例代码。我应该做以下事情:
var facts = _subjectsRepository.GetAll()
.Where(a => a.SubjectId == subjectId)
然后做一些长的。包括主题,SubTopic,事实和最后答案的列表?请注意,管理员会使用这些数据,因此尽管我需要快速恢复数据,但不需要非常快速地将数据返回给我。
请注意,在不久的将来,我们希望开始使用EF6和SQL Server 2014预览。我很想知道是否有人知道这些可能带来的任何功能,这将有助于我们在这种情况下获取数据的需求。
答案 0 :(得分:1)
如果您只想要Fact
个实体和Answer
个实体,那么返回Topic
和Subtopic
个实体也没有意义。而不是获得Subject
实体并且使用include进入5级深度。像下面的东西可能会这样。
var query = context.Facts
.Where(f => f.Subtopic.Topic.SubjectId == mySubjectId)
.Include(f => f.Answers);