1

我有接受 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)
                                   });
        }
4

2 回答 2

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();        
}
于 2013-02-25T12:59:37.667 回答
2

尝试使用

GetUsersView(u=>true);

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

IQueryable<UserView> GetUsersView()
{
   return GetUsersView(u=>true);
}
于 2013-02-25T12:14:38.227 回答