过滤相关实体或导航属性,其中Entity Framework 6中有连接表

时间:2015-07-29 14:12:25

标签: c# asp.net entity-framework entity entity-framework-6

我有三个实体RoleRoleUserUser

我想选择每个强制性Role并加载相关的User,其中联接表中的RoleUser.RecordID等于给定值。

使用UOW和GenericReposiity Get(...)方法我会称之为......

.Get(role => role.Compulsory == true, null, "RoleUser.User")选择所有必填角色并为导航User加载所有RoleUser.User

如何使用已实施的Get()方法过滤它们?

实体

    public class Role
    {
        public int RoleID { get; set; }

        public bool Compulsory { get; set; }

        public virtual IList<RoleUser> RoleUser { get; set; }       
    }


    public class RoleUser
    {
        public string UserID { get; set; }

        public virtual User User { get; set; }


        public Guid RecordID { get; set; }

        public virtual Record Record { get; set; }


        public int RoleID { get; set; }

        public virtual Role Role { get; set; }
    }


    public class User
    {
        public string userID { get; set; }
    }

获取

    public virtual IList<TEntity> Get(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string includeProperties = "")
    {
        IQueryable<TEntity> query = dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }

        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }

        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }

1 个答案:

答案 0 :(得分:0)

  

不,您无法从此Get方法中过滤RoleUser。如果要过滤RoleUser,则要将它们投影到另一个列表中。

     

您可以根据Role表格过滤RoleUser

     

除非您使用IQuerable Projection,否则Include将始终在表格中显示完整数据。

var rolesWithAnyUserName = UnitOfWork.Role
                                     .Get(role => role.Compulsory == true && role.RoleUser
                                   .Any(g=>g.RoleUserName=="Name"), null, "RoleUser.User") 

这只会根据Role过滤器过滤RoleUser

如果您需要过滤Include表,请编写查询,将IQuerable发送到数据库

尝试这样的操作,这会同时过滤RoleRoleUser

var result = DataContext.Role.Where(role => role.Compulsory == true )
                .Include(gl => gl.RoleUser)
                .Select(x => new
                {
                    role = x,
                    roleUsers= x.RoleUser.Where(g => g.Id == 1),
                }).ToList();