C# 如何使用实体框架根据用户有权访问的内容选择数据
我使用的是代码优先实体框架,我已经创建了所有的模型(Category、Data、UserData),并让EF创建了所有的表。因此,我的数据库当前看起来如下所示: 我已经设法用category表对“self relationship”进行了排序,还设法在“data”表中进行了链接。EF非常高兴地为给定的父项提取所有类别,以及相关的“数据”项 我被卡住的地方是;仅获取用户有权“访问”的类别中的“数据”项。这样一来,用户就可以在一个类别中创建“数据”项,然后授予查看权限。以下是我的模型的代码清单:C# 如何使用实体框架根据用户有权访问的内容选择数据,c#,entity-framework,orm,relational-database,entity-relationship,C#,Entity Framework,Orm,Relational Database,Entity Relationship,我使用的是代码优先实体框架,我已经创建了所有的模型(Category、Data、UserData),并让EF创建了所有的表。因此,我的数据库当前看起来如下所示: 我已经设法用category表对“self relationship”进行了排序,还设法在“data”表中进行了链接。EF非常高兴地为给定的父项提取所有类别,以及相关的“数据”项 我被卡住的地方是;仅获取用户有权“访问”的类别中的“数据”项。这样一来,用户就可以在一个类别中创建“数据”项,然后授予查看权限。以下是我的模型的代码清单:
[Table("Category")]
public class Category
{
[Key]
public Int32 CategoryId { get; set; }
public string CategoryName { get; set; }
public Int32? Category_ParentID { get; set; }
[ScriptIgnore]
public virtual Category Parent_Category { get; set; }
[ScriptIgnore]
public virtual ICollection<Category> SubCategories { get; set; }
[ScriptIgnore]
public virtual ICollection<Data> Datas { get; set; }
public Int16 CategoryOrder { get; set; }
public bool Deleted { get; set; }
}
[Table("Data")]
public class Data
{
[Key]
public Int32 DataId { get; set; }
public string Data { get; set; }
public Int32 Parent_CategoryId { get; set; }
[ScriptIgnore]
public virtual Category Parent { get; set; }
}
[Table("UserData")]
public class UserData
{
[Key]
[Column(Order=1)]
public Int32 Id { get; set; }
[Key]
[Column(Order = 2)]
public Int32 DataId { get; set; }
public Data UsersData { get; set; }
public ApplicationUser UserDataUser { get; set; }
}
上面的代码当前获取一个指定的父类别及其关联的子类别和“数据”项-我需要过滤掉用户无权访问的“数据”项。您只需要添加此过滤器
var userId = ..; // provides the user id
Datas = c.Datas.Where(d =>
!d.Deleted
&& DatabaseContext.UserDatas.Any(ud =>
ud.DataId == d.DataId && ud.Id == userId).ToList()
)
你想退货什么?类别列表?数据列表?请提供您尝试过的示例代码,以便我们知道在哪里进行修复。我在问题中添加了更多内容。您在查询的开头有
ToList
,它将执行数据库中的所有类别,您是否计划将筛选作为对象而不是sql?是的,理想情况下我会编写一个存储过程或LINQ查询。。。但我只是想了解实体框架。AsEnumerable()不起作用,但其他几乎都起作用了。@binks,如果要使用第二个选项,则需要在查询期间禁用延迟加载,直到检索到所有值为止。它似乎不起作用,我总是遇到这样的错误:无法在LINQ to Entities查询中构造实体或复杂类型“Category”。@binks,我删除了第二个选项,可能在转换查询时遗漏了什么
//return the selected item - with its children
var selectedCategoryItem = DatabaseContext.Categories
.ToList().Select(c => new Category()
{
SubCategories = c.SubCategories.Where(sub => !sub.Deleted).ToList(), //make sure only undeleted subcategories are returned
CategoryId = c.CategoryId,
CategoryName = c.CategoryName,
Category_ParentID = c.Category_ParentID,
CategoryOrder = c.CategoryOrder,
Parent_Category = c.Parent_Category,
Datas = c.Datas.Where(d => !d.Deleted).ToList(), //make sure only undeleted Datas are returned
Deleted = c.Deleted
})
.Single(c => c.CategoryId == ParentCategoryId);
var userId = ..; // provides the user id
Datas = c.Datas.Where(d =>
!d.Deleted
&& DatabaseContext.UserDatas.Any(ud =>
ud.DataId == d.DataId && ud.Id == userId).ToList()
)