代码之家  ›  专栏  ›  技术社区  ›  Simple Code

如何使用实体框架为特定实体显式加载特定的相关实体?

  •  0
  • Simple Code  · 技术社区  · 7 年前

    1) 位置 有很多员工

    2) 员工 它有很多角色

      var location = dbContext.Locations.Find(locationId);
      dbContext.Entry(location).Collection(b => b.Staffs).Query().Where(s => s.Roles.Any(r => r.Name=="Supervisor"));
    

    我的问题是如何为所有地点的具有主管角色的相关员工实现显式加载(我不需要如上所述的特定人员)?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Toxantron    7 年前

    我为存储库模式的实现做了类似的事情。关键是调用 Load 最后。

    我们有

    public virtual void Load<TOut>(T entity, Expression<Func<T, ICollection<TOut>>> loadExpression, Expression<Func<TOut, bool>> filter) where TOut : class
    {
        Context.Entry(entity).Collection(loadExpression).Query().Where(filter).Load();
    }
    

    所以你可以试试看

    dbContext.Entry(location).Collection(b => b.Staffs).Query()
        .Where(s => s.Roles.Any(r => r.Name=="Supervisor")).Load();
    

    Linq2Entities 查询您的案例。

    var locationWithStaff = (from location in dbContext.Locations
                             select new
                             {
                                 location,
                                 Staffs = (from staff in location.Staffs
                                           where staff.Roles.Any(r => r.Name=="Supervisor")
                                           select staff).ToList()
                              }).ToList();
    
        2
  •  1
  •   Riv    7 年前

    dbContext.Locations.SelectMany(b => b.Staffs).Where(s => s.Roles.Any(r => r.Name=="Supervisor"));
    

    您可以在SelectMany中返回一个匿名类型,该类型将包含位置属性,例如:

    dbContext.Locations.SelectMany(x => x.Staffs, (x, Staffs) => 
                       new { locationID = x.LocationID, SomeOtherProperty = x.OtherProperty , Staff = Staffs })
                      .Where(y => y.Staff.Roles.Any(z => z.Name == "Supervisor"));