条件检查谓词 LINQ
本文关键字:LINQ 谓词 检查 条件 | 更新日期: 2023-09-27 18:36:48
我有一个返回谓词的类:
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));