[英]conditional check in predicate LINQ
我有一个返回谓词的类:
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
类,您能向我展示如何解决此类问题吗?
您可以执行以下操作(我不确定我是否正确阅读了您的要求,但希望这是一个有效的起点):
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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.