2014-02-14 2 views
2

У меня есть метод, который ожидает следующие параметры:Как условно передать параметры в массив Func

public IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] includeProperties) 
{ 
    foreach (var includeProperty in includeProperties) 
    { 
     dbSet.Include(includeProperty); 
    } 
    return dbSet; 
} 

Вот как я прохожу в моем Params:

IQueryable<User> users = repo.GetAllIncluding(u => u.EmailNotices, u => u.EmailTemplatePlaceholders, u => u.Actions); 

Однако, мне нужно, чтобы быть в состоянии для проверки определенных условий, прежде чем я передам их или нет.

Например, если у меня есть переменная useEmailNotices = false, то я не хочу проходить в EmailNotices, но если это true, тогда я делаю. Мне нужно сделать это для всех трех. Я знаю, что есть большой путь для этого, но я надеялся, что есть одна строчка короткими способами или функция создания параметров или что-то в этом роде.

+0

Repository ... обнажая IQueryable ... Вздох ... – Phill

+0

@Phill Что вы порекомендуете? Я действительно получил этот фрагмент кода из [Julie Lerman] (http://pluralsight.com/training/Authors/Details/julie-lerman) – RichC

+0

Выявление IQueryable - это непроницаемая абстракция, если вы собираетесь показать, что можете а также покончить с репозиторием и начать использовать UoW напрямую. – Phill

ответ

3

Что об изменении подписи метода

public IQueryable<TEntity> GetAllIncluding(IEnumerable<Expression<Func<TEntity, object>>> includeProperties) 

определяющим вашу условную логику в других

var args = new List<Expression<Func<TEntity, object>>>(); 
if (useEmailNotices) 
    args.Add(u => u.EmailNotices); 

, а затем просто вызывающей метод как

IQueryable<User> users = repo.GetAllIncluding(args); 
+0

Убей меня :) –

+0

@DavidKhaykin Здесь не так уж много вариантов, не так ли? :) –

+0

Да, только List должен иметь объект User, а не общий TEntity, я думаю. –

2

Вместо Params, используйте List<T>, объявленный фактическим лицом, которое вы хотите перейти в:

var funcList = new List<Expression<Func<User, object>>>(); 

funcList.add(u => u.EmailTemplatePlaceholders); 

if (useEmailNotices) 
    funcList.add(u => u.EmailNotices); 

И метод подписи будет теперь:

public IQueryable<TEntity> GetAllIncluding(List<Expression<Func<TEntity, object>> includeProperties) 
{ 
    foreach(...) 
} 
Смежные вопросы