использовать IncludeMultiple в методе

#c# #.net #entity-framework

#c# #.net #entity-framework

Вопрос:

Я использую метод расширения Ладислава Мрнки:

     public static IQueryable<T> IncludeMultiple<T>(this IQueryable<T> query,
        params Expression<Func<T, object>>[] includes)
        where T : class
    {
        if (includes != null)
        {
            query = includes.Aggregate(query,
                      (current, include) => current.Include(include));
        }

        return query;
    }
  

Я взял следующий метод из Здесь (после небольшого изменения):

 public virtual IEnumerable<T> Get(
            Expression<Func<T, bool>>[] filters = null,
            Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
            string includeProperties = "")
        {
            IQueryable<T> query = GetQuery();

            if (filters != null)
            {
                foreach (var filter in filters)
                {
                    query = query.Where(filter);
                }
            }

            foreach (var includeProperty in includeProperties.Split
                (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
            {
                query = query.Include(includeProperty);
            }

            if (orderBy != null)
            {
                query = orderBy(query);
            }

            return query;
        }
  

Я хочу использовать IncludeMultiple вместо строк в переменной includeProperties.
Итак, я изменил функцию:

 public virtual IEnumerable<T> Get(
            Expression<Func<T, bool>>[] filters = null,
            Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
            params Expression<Func<T, object>>[] includes)
        {
            IQueryable<T> query = GetQuery();

            if (filters != null)
            {
                foreach (var filter in filters)
                {
                    query = query.Where(filter);
                }
            }

            if (includes.Length > 0)
            {
                query = query.IncludeMultiple(includes);
            }

            if (orderBy != null)
            {
                query = orderBy(query);
            }

            return query;
        }
  

Теперь я немного запутался. Этот метод определен в классе, где определен GetQuery() (реализация репозитория). Но в случае, если я захочу выполнить этот метод, я бы изначально использовал GetQuery()..
Я прав?
Лучше ли использовать это как расширение к IQueryable?

Ответ №1:

Нет, вам не нужно использовать этот метод после вызова, GetQuery потому что вызов GetQuery является первой командой в этом методе. Вы можете использовать либо GetQuery , либо Get в зависимости от ваших потребностей. Get Метод на самом деле очень хорош, потому что он скрывает включение. Использовать его как метод репозитория намного лучше, чем использовать его как метод расширения в случае модульного тестирования и макетирования.

Комментарии:

1. Каковы плюсы и минусы размещения метода Get в репозитории по сравнению с размещением метода Get в качестве расширения к IQueryable?

2. @Naor: Метод расширения статичен — он однажды написан, и вы не можете его изменить, вы не можете издеваться над ним. Метод экземпляра может быть сделан виртуальным и переопределен в производных классах. Метод расширения не является частью интерфейса класса и может использоваться в нескольких классах, реализующих один и тот же тип, используемый в this объявлении метода расширения.