我有接受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)
});
}
答案 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();
}