【问题标题】:Using linq to instantiate objects containing lists of other objects, where query criteria is on inner list使用 linq 实例化包含其他对象列表的对象,其中查询条件位于内部列表中
【发布时间】:2023-04-02 12:38:02
【问题描述】:

我有一个 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);

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

【问题讨论】:

  • 为什么人员和工作在两个不同的存储库中?
  • 抱歉。他们不是。
  • @RobertMcKee 实际上,存储库略有不同。它们都是相同的界面,但具有不同的模型。我进行了编辑以显示这一点。
  • GetPeople 不会按照您目前的方式为您提供每个人的所有工作列表吗?
  • 是的。对不起。这是真实事物的简化版本。我会再次编辑。

标签: c# mysql linq


【解决方案1】:

通常,如果使用实体框架,我会说你会这样做:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多