我的数据库中经验和主题之间有很多关系。
从经验列表中,我将按下按钮以获得特定体验,然后进入列表,显示与所选体验相关的所有主题。按下按钮我会收到体验ID。
我尝试过这样的事情,显然没有用;
var subjectList = db.Subjects.Where(s => s.Experiences== id).SelectMany(s => s.Subjects).ToList();
任何人都知道如何使用ID找到与体验相关的所有主题,还是有其他方式?
体验
public virtual ICollection<Subject> Subjects { get; set; }
public virtual User ApplicationUser { get; set; }
public Experience()
{
this.Subjects = new HashSet<Subject>();
}
主题
public virtual ICollection<Experience> Experiences { get; set; }
public Subject()
{
this.Experiences = new HashSet<Experience>();
}
答案 0 :(得分:0)
在EF / Linq查询中简单使用Include
所以
var results = ctx.Experiences.Include(e => e.Subjects).Where(e => e.Id == _id);
然后您可以通过[编辑] Subjects
访问所有results.Select(x => x.Subjects)
,这将为您提供IEnumerable<IEnumerable<Subjects>>
。它可以使用SelectMany(x => x)
展平。
这假设您的课程类似于:
public class Experience {
public virtual ICollection<Subject> Subjects {get; set;}
}
答案 1 :(得分:0)
通常在多对多关系中,相关的EF类具有一个导航属性,表示与每个项目关联的对象集合。
在您的示例代码中,您引用了Subject.Experiences
,但是您错过了正确关联体验ID的文章。
这样的事情可以解决问题,其中id
是选定的经验ID:
var subjectList = db.Subjects
.Where(s => s.Experiences.Any(experience => experience.Id == id))
.ToList();
答案 2 :(得分:0)
使用Include和ThenInclude
var subjectList = db.Subjects
.Where(s => s.Experiences== id)
.Include(s => s.NavigationToMiddleTable)
.ThenInclude(x => x.RelatedTable)
.ToList();
请记住,您的Entity类必须具有MiddleTable和最后一个RelatedTable的导航属性