C# 如何从LINQ查询中的.Include字段中获取数据?

C# 如何从LINQ查询中的.Include字段中获取数据?,c#,linq,C#,Linq,我使用的是实体框架5,我有这些类。我想做的是能够获取数据以填充下面列出的视图: public partial class Subject { public int SubjectId { get; set; } public string Name { get; set; } public virtual ICollection<Topic> Topics { get; set; } } public partial class Topic { pu

我使用的是实体框架5,我有这些类。我想做的是能够获取数据以填充下面列出的视图:

public partial class Subject
{
    public int SubjectId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Topic> Topics { get; set; }
}

public partial class Topic
{
    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 int SubTopicId { get; set; }
    public string Name { get; set; }
    public int TopicId { get; set; }
    public virtual Topic Topic { get; set; }
}
到目前为止,我有:

        return _subjectsRepository
            .GetAll()
            .Where(s => s.SubjectId == subjectId)
            .Include(s => s.Topics.SelectMany(t => t.SubTopics))
            .AsEnumerable()
            .Select(item => new TopicSubTopicSelect(item.TopicId <<<
                                                    item.SubTopicId <<
                                                    item.Topic.Name <<
                                                    item.Name <<))
            .ToList();
return\u subjects repository
.GetAll()
。其中(s=>s.SubjectId==SubjectId)
.Include(s=>s.Topics.SelectMany(t=>t.SubTopics))
.可计算的()

.Select(item=>newtopicsubtopicselect(item.TopicId你不应该从Subject开始。你只需要从SubTopic存储库开始,甚至不需要使用
。包括
。这样做:

_subTopicRepository
    .GetAll()
    .Where(s => s.Topic.SubjectId == subjectId)
    .Select(s => new TopicSubTopicSelect()
       {
          TopicId = s.TopidId,
          SubTopicId = s.SubTopicId,
          TopicName = s.Topic.Name,
          SubTopicName = s.Name
       })
    .ToList();

正如我在对阿塔拉瓦蒂回答的评论中提到的,你实际上不应该有一个
子主题库
,因此你从
主题库
开始是正确的,但是你是通过主题ID查询的,所以你不应该通过
GetAll()
,你应该有一个
Get(int-ID)
method。include应该作为
Get
中的实现细节处理,因为子主题(子主题)是主题的一部分。这使得方法调用看起来像这样:

return _subjectsRepository
        .Get(subjectId)
        .SelectMany(subject => subject.SubTopics))
        .Select(subTopic => new TopicSubTopicSelect
        {
            TopicId = subTopic.TopicId,
            SubTopicId = subTopic.SubTopicId,
            TopicName = subTopic.Topic.Name,
            SubTopicName = subTopic.Name
        }).ToList();

希望
.GetAll()
IQueryable
而不是
IEnumerable
…子主题存储库不应该有
GetBySubjection
方法来封装这个查询而不是公开它吗?子主题存储库应该有GetBySubjection,而不是SubTopicRepository。您的示例使用的是SubTopicRepository,这就是我提到它的原因-strict是的,这根本不应该存在!Topic是聚合根,没有Topic子主题就没有意义,所以入口点应该始终是Topic。
return _subjectsRepository
        .Get(subjectId)
        .SelectMany(subject => subject.SubTopics))
        .Select(subTopic => new TopicSubTopicSelect
        {
            TopicId = subTopic.TopicId,
            SubTopicId = subTopic.SubTopicId,
            TopicName = subTopic.Topic.Name,
            SubTopicName = subTopic.Name
        }).ToList();