我有三个实体Role
,RoleUser
和User
我想选择每个强制性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();
}
}
答案 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
发送到数据库
尝试这样的操作,这会同时过滤Role
和RoleUser
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();