繁体   English   中英

谓词LINQ中的条件检查

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM