C# 使用linq实例化包含其他对象列表的对象,其中查询条件位于内部列表中

C# 使用linq实例化包含其他对象列表的对象,其中查询条件位于内部列表中,c#,mysql,linq,C#,Mysql,Linq,我有一个DB表,我们称之为“People”,其中有一个实体与之关联,还有一个视图模型类Person,它包含另一个表中的对象列表,比如说“Jobs”。每项工作都有一段时间。使用LINQ,我想创建一个包含IQueryable的IQueryable 数据库里有很多人。我想吸引那些工作时间超过6个月的人 我所拥有的是: public IQueryable<Person> GetPeople() => Repo<Person>.Get().Select(p =>

我有一个DB表,我们称之为“People”,其中有一个实体与之关联,还有一个视图模型类Person,它包含另一个表中的对象列表,比如说“Jobs”。每项工作都有一段时间。使用LINQ,我想创建一个包含IQueryable的IQueryable

数据库里有很多人。我想吸引那些工作时间超过6个月的人

我所拥有的是:

public IQueryable<Person> GetPeople() =>
    Repo<Person>.Get().Select(p => new Person 
    {
        Name = p.Name,
        Jobs = GetJobs(p.Name)
    }).Where(h => h.Jobs.Count() > 0);

public IQueryable<Job> GetJobs(string name) => 
    Repo<Job>.Get().Where(j => j.name == name && j.time > 6);
public IQueryable GetPeople()=>
Repo.Get().Select(p=>newperson
{
名称=p.名称,
Jobs=GetJobs(p.Name)
}).Where(h=>h.Jobs.Count()>0);
公共IQueryable GetJobs(字符串名称)=>
Repo.Get().Where(j=>j.name==name&&j.time>6);

问题是,这会吸引每个人,然后为每个人查询工作,这是低效的。是否有一种好方法可以先提取工作,然后创建一个人员列表,每个人都有自己的合格工作列表?

通常,如果使用实体框架,我会说您只需要这样做:

var results=db.People.Where(p=>p.Jobs.Any(j=>j.time>6));

这假设您有一个
Person
类,该类由表
People
表示,
Person
类有一个名为
Jobs
的导航属性,该属性引用
Jobs
表。

为什么人员和作业在两个不同的存储库中?抱歉。事实上,回购协议略有不同。它们都是相同的界面,但型号不同。我编辑的目的就是为了说明这一点。GetPeople不会按照您目前的方式为每个人提供所有人的所有工作列表吗?是的。很抱歉这是真实事物的简化版本。我将再次编辑。