1

LinqWhere句の式を受け入れるメソッドがあります。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

使ってみてください

GetUsersView(u=>true);

または、式を常に入力したくない場合は、デフォルトの式を提供するオーバーロードされた関数を作成できます。

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

メソッドにnullを渡すのは恐ろしい考えです。合格u => trueもあまり読みにくいです。代わりに2つのメソッドを作成します。1つはパラメーターを持ち、もう1つはパラメーターを持ちません。また、あなたのメソッドには2つの責任があると思います。ユーザーをフィルタリングし、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 に答える