簡體   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