2013-07-27 58 views
-2

我正在使用实体框架5,我有这些类。我想要做的是能获得数据来填充下列观点:如何从LINQ查询中的.Include字段获取数据?

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

谁能告诉我怎样才能得到我打上< <字段中的数据。我试图做.item.Topic.TopicId等,但似乎并没有工作。

回答

1

你不应该从主题开始。你只需从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(); 
+0

希望这'.GetAll()''是不是IQueryable''IEnumerable' ......,不应该SubTopicRepository有'GetBySubjectId'方法来封装这个查询而不是暴露它? –

+0

SubjectRepository应该有一个GetBySubjectId,而不是SubTopicRepository。 – ataravati

+0

你的例子是使用SubTopicRepository,这就是为什么我提到它 - 严格来说,它不应该存在! Topic是聚合根,如果没有Topic,SubTopics是没有意义的,所以入口点应该始终是Topic。 –

0

正如我在上ataravati的答案评论中提到,你不应该确实有一个SubTopicRepository所以你是正确的开始SubjectsRepository但是你通过对象ID查询,所以你不该”不要去通过GetAll(),你应该有一个Get(int id)方法。这些包含应作为Get内的实现细节进行处理,因为子项(SubTopics)是主题的一部分。这使得该方法调用这个样子的,而不是:

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(); 
相关问题