我正在使用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等,但这似乎不起作用。
答案 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();