C# 如何使用实体框架根据用户有权访问的内容选择数据

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非常高兴地为给定的父项提取所有类别,以及相关的“数据”项 我被卡住的地方是;仅获取用户有权“访问”的类别中的“数据”项。这样一来,用户就可以在一个类别中创建“数据”项,然后授予查看权限。以下是我的模型的代码清单:

我使用的是代码优先实体框架,我已经创建了所有的模型(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()
)