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

时间:2013-07-27 16:41:30

标签: c# linq

我正在使用Entity Framework 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; }
}

现在我正在尝试编写一个LINQ查询来填充这个类:

public class TopicSubTopicSelect
{
    public int TopicId { get; set; }
    public int SubTopicId { get; set; }
    public string TopicName { get; set; }
    public string SubTopicName { 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();

有人可以告诉我如何从我标记为&lt;&lt;的字段中获取数据。我试着做.item.Topic.TopicId等,但这似乎不起作用。

2 个答案:

答案 0 :(得分:0)

你不应该从主题开始。您只需从SubTopic Repository开始,甚至不需要使用.Include。这样做:

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

答案 1 :(得分:0)

正如我在ataravati回答的评论中提到的那样,你实际上不应该SubTopicRepository,所以你在SubjectsRepository开始是正确的,但是你要通过主题ID查询,所以你不应该要通过GetAll(),您应该使用Get(int id)方法。 include应作为Get内的实现细节处理,因为子(SubTopics)是Subject的一部分。这使得方法调用看起来像这样:

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