我在BL和实体框架DAL之间创建了中间件层,用于根据应用程序中的用户权限业务逻辑过滤数据。我的层实现了IObjectSet,它有一个"无过滤的ObjectSet"的实例,每当使用ObjectSet时,过滤器表达式就会运行。所有的工作格栅,而不是方法"包括"。我发现了一个解决方案,即创建一个扩展方法,将"无过滤的ObjectSet"转换为ObjectQuery并使用ObjectQuery。方法,但此解决方案可能导致绕过权限过滤。
public IQueryable<TEntity> Include<TJoin>(string path)
{
if (_nonAuthorizedObjectSet is ObjectQuery<TEntity>)
{
var result = ((ObjectQuery<TEntity>)_nonAuthorizedObjectSet).Include(path);
return result as IQueryable<TEntity>;
}
}
例如:表名"Items"有列{Item_Id,Owner,Item_Type_Id}该表有一个权限逻辑,即用户只能看到Owner==user的项。表"Item_Types"没有权限逻辑。
通过:PermittedDAL。items . toarray() -只获取current_user==Owner的项。Item_Types.Include("项目")问题! !-我得到所有的项目。
谢谢
EF不支持过滤急于加载的记录(Include)。只能过滤主记录。如果需要过滤关系,则必须使用自定义投影或为每个关系单独查询。