Ale*_*x07 2 c# sql frameworks entity repository
我正在使用Entity框架(对象上下文)检查通用存储库的可能性.
我有一个界面
interface IRepository<T> where T : class
{
IList<T> GetItems(Func<T, bool> Where, params string[] Navigations);
}
Run Code Online (Sandbox Code Playgroud)
以及实现接口的类
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有另一个类扩展GenericRepository.并实现另一个接口(现在不导入,因为该接口当前只扩展了IRepository而没有添加任何功能).
class EmployeeRepository : GenericRepository<Employee>, IEmployeeRepository
{
}
Run Code Online (Sandbox Code Playgroud)
当我想从我的存储库中获取数据时,我会这样做:
private void Test()
{
IEmployeeRepository rep = new EmployeeRepository();
IList<Employee> list = rep.GetItems(
e => e.Department.Name.Contains("Os")
&& e.Role.Type == 2,
"Department", "Role"
);
}
Run Code Online (Sandbox Code Playgroud)
在这里我得到一个错误,说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"
);
Run Code Online (Sandbox Code Playgroud)
最后,我会将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;
}
}
Run Code Online (Sandbox Code Playgroud)