C# 使用linq实例化包含其他对象列表的对象,其中查询条件位于内部列表中
我有一个DB表,我们称之为“People”,其中有一个实体与之关联,还有一个视图模型类Person,它包含另一个表中的对象列表,比如说“Jobs”。每项工作都有一段时间。使用LINQ,我想创建一个包含IQueryable的IQueryable 数据库里有很多人。我想吸引那些工作时间超过6个月的人 我所拥有的是: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 =>
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不会按照您目前的方式为每个人提供所有人的所有工作列表吗?是的。很抱歉这是真实事物的简化版本。我将再次编辑。