实体框架:通用存储库中的包含和位置子句

本文关键字:包含 位置 子句 框架 存储 实体 | 更新日期: 2023-09-27 17:56:06

我正在使用实体框架(对象上下文)检查通用存储库的可能性。

我有一个界面

    interface IRepository<T> where T : class
    {
       IList<T> GetItems(Func<T, bool> Where, params string[] Navigations);
    }

和实现接口的类

    class GenericRepository<T> : IRepository<T> where T : class
    {
       public IList<T> GetItems(Func<T, bool> Where, params string[] Navigations)
       {
           List<T> list;
           using(var ctx = new Context())
           {
               IQueryable<T> query = ctx.CreateObjectSet<T>();
               foreach (string nav in Navigations)
                    (query as ObjectQuery<O>).Include(nav);
               list = query.Where(Where).ToList<T>();
           }
           return list;
       } 
    }

然后我有另一个扩展 GenericRepository 的类。并实现另一个接口(现在不导入,因为该接口目前只是扩展了 IRepository,没有添加任何功能)。

    class EmployeeRepository : GenericRepository<Employee>, IEmployeeRepository
    {
    }

当我想从我的存储库中获取数据时,我会做这样的事情:

    private void Test()
    {
        IEmployeeRepository rep = new EmployeeRepository();
        IList<Employee> list = rep.GetItems(
                                            e => e.Department.Name.Contains("Os")
                                            && e.Role.Type == 2,
                                            "Department", "Role"
                                           );
    }

在这里,我收到一个错误,说 e.Department 为空(我相信我也得到了一个角色)。

模型有三个实体

  • 员工
  • 部门
  • 角色

部门 1..* 员工角色 1..1 员工

是否可以像我一样在参考表上添加预测?(有一些变化)。

谢谢!

实体框架:通用存储库中的包含和位置子句

首先,使用 Expression<Func<T, bool>> 而不是 Func<T, bool>

如果使用 Func<T, bool> ,您将在应用谓词之前枚举!

这可能就足够了。

如果不是,请添加一些空检查。

IList<Employee> list = rep.GetItems(
                                     e => e.Department != null && e.Department.Name.Contains("Os")
                                     && e.Role != null && e.Role.Type == 2,
                                     "Department", "Role"
                                    );

最后,我将 GenericRepository 的实现更改为

class GenericRepository<T> : IRepository<T> where T : class
    {
       public IList<T> GetItems(Expression<Func<T, bool>> predicate, params string[] navigationProperties)
       {
           List<T> list;
           using(var ctx = new Context())
           {
               var query = ctx.Set<T>().AsQueryable();
               foreach (string navigationProperty in navigationProperties)
                    query = query.Include(navigationProperty);//got to reaffect it.
               list = query.Where(predicate).ToList<T>();
           }
           return list;
       } 
    }

您确定所有员工都有一个部门?那个部门装满了?否则我会添加一个检查,如果 e.Department <>为空