繁体   English   中英

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

[英]Filter related entities or navigation property where there is a join table in Entity Framework 6

我有三个实体RoleRoleUserUser

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

使用 UOW 和 GenericReposiity Get(...)方法我会调用...

.Get(role => role.Compulsory == true, null, "RoleUser.User")选择所有强制角色并加载导航RoleUser.User所有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();
        }
    }

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

您可以根据RoleUser表过滤您的Role

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

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

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

如果您需要过滤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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM