我有一个返回谓词的类:
public class UserPredicateBuilder
{
public Guid Id{ get; set; }
public IEnumerable<Role> Roles{ get; set; }
public UserType UserType{ get; set; }
protected override Expression<Func<User, bool>> Predicate
{
get
{
return l => l.UserType == UserType
&& l.Id== Id
&& Roles.Contains(l.Role);
}
}
}
public enum UserType
{
None,
Admin,
User,
Guest
}
public enum Role
{
None,
Create,
Delete,
Update
}
现在,Predicate
属性会检查所有字段。我想查一下:
- Id
如果不等于Guid.Empty
;
- UserType
如果不等于None
;
- Roles
以同样的方式,通过集合迭代,只选择不None
元素并检查它;
在传统方式中,我可以这样做:
public class SomeClass
{
public Guid Id { get; set; }
public IEnumerable<Role> Roles{ get; set; }
public UserType UserType{ get; set; }
public IList<User> GetUsers(some args)
{
IQueryable<User> query = ...;
if(user.Id != Guid.Empty)
query = query.Where(u=>u.Id == Id);
if(user.UserType != UserType.None)
query = query.Where(u=>u.UserType == UserType)
...
return query.ToList();
}
}
如何在我的场景中执行此操作?我找到了PredicateBuilder
课,你能告诉我如何用这个课解决我的问题吗?
答案 0 :(得分:1)
你可以这样做(我不确定我是否正确地阅读了你的要求,但希望这是一个有效的起点):
return l => (UserType == UserType.None || l.UserType == UserType)
&& (Id == Guid.Empty || l.Id == Id)
&& (!Roles.Any() || Roles.Where(r => r != Role.None).Contains(l.Role));