Linq将null传递给Where子句

时间:2013-02-25 12:04:59

标签: linq

我有接受Linq Where子句的表达式的方法。有时我想忽略Where子句而不使用它。

我试图将null传递给像这样的方法

GetUsersView(null)

但是有例外。这是怎么做到的?

 private IQueryable<UserView> GetUsersView(Expression<Func<User, bool>> expression)
        {            
            return _userRepository.GetAll().
                                   Where(expression).
                                   Select(p => new UserView
                                   {
                                       Id = p.Id,
                                       Active = p.Orders.Any(c => c.Active && (c.TransactionType == TransactionType.Order || c.TransactionType == TransactionType.Subscription)),
                                       DateStamp = p.DateStamp,
                                       Email = p.Email,
                                       FirstName = p.FirstName,
                                       LastName = p.LastName,
                                       Message = p.Message,
                                       UsersManager = p.Orders.Select(o => o.Product).Any(w => w.UsersManager && w.Active)
                                   });
        }

2 个答案:

答案 0 :(得分:2)

尝试使用

GetUsersView(u=>true);

或者如果您不想一直输入表达式,可以创建一个提供默认表达式的重载函数。

IQueryable<UserView> GetUsersView()
{
   return GetUsersView(u=>true);
}

答案 1 :(得分:2)

将空值传递给方法是一个可怕的想法。传递u => true也不是很易读。创建两个方法 - 一个有参数,另一个没有。此外,我看到您的方法有两个职责 - 它过滤用户,并将它们转换为UserViews。我认为谓词过滤用户应该在存储库中进行。

您还可以创建扩展方法IQueryable<UserView> ToViews(this IQueryable<User> source)

public static IQueryable<UserView> ToViews(this IQueryable<User> source)
{
    return source.Select(u => new UserView
         {
            Id = u.Id,
            Active = u.Orders.Any(o => o.Active && 
                            (o.TransactionType == TransactionType.Order ||
                             o.TransactionType == TransactionType.Subscription)),
            DateStamp = u.DateStamp,
            Email = u.Email,
            FirstName = u.FirstName,
            LastName = u.LastName,
            Message = u.Message,
            UsersManager = u.Orders.Select(o => o.Product)
                                   .Any(p => p.UsersManager && p.Active)
         });     
}

在这种情况下,代码将如下所示:

private IQueryable<UserView> GetUserViews()
{
    return _userRepository.GetAll().ToViews();
}

private IQueryable<UserView> GetUserViews(Expression<Func<User, bool>> predicate)
{
    // move filtering to repository      
    return _userRepository.GetAll(predicate).ToViews();        
}