используйте IncludeMultiple в методе - PullRequest
4 голосов
/ 26 апреля 2011

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

    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 Ответ

0 голосов
/ 26 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...