条件检查谓词 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类,你能告诉我如何解决我在这个类中的问题吗?

条件检查谓词 LINQ

你可以做这样的事情(我不确定我是否正确阅读了你的要求,但希望这是一个有效的起点):

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));