我可以合理地使用LINQ中的.Include和SQL Server 2012后端深入五个级别吗



我使用的是带有SQL Server 2012数据库和以下类结构的Entity Framework 5。结构有五个层次:

主题>主题>子主题>事实>答案

当SubjectId给我时,我需要的是能够获得一个事实对象列表及其答案。我关心的是性能以及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();

现在我有了一个新的需求,我不确定如何获得我需要的数据。我需要的是得到一个属于给定主题的事实和答案的列表。

我将感谢一些建议,并希望能提供一些示例代码。我应该做以下事情吗:

        var facts = _subjectsRepository.GetAll()
            .Where(a => a.SubjectId == subjectId)

然后做一些长的。包括主题、子主题、事实和最终答案的列表?请注意,这些数据是由管理员使用的,所以尽管我需要快速返回数据,但它不需要非常快地返回给我。

请注意,在不久的将来,我们希望开始使用EF6和SQL Server 2014预览版。我很想知道是否有人知道这些可能带来的任何功能,这些功能将有助于我们在这种情况下获取数据。

如果您只想要Fact实体和Answer实体,那么也没有必要返回TopicSubtopic实体。而不是获取Subject实体并使用include深入5个级别。下面这样的东西也许可以。

var query = context.Facts
                   .Where(f => f.Subtopic.Topic.SubjectId == mySubjectId)
                   .Include(f => f.Answers);

相关内容

最新更新