Универсальный метод многоуровневого включает в себя - PullRequest
0 голосов
/ 10 октября 2018

Я создавал несколько общих утилит уровня ORM, чтобы вызывающим абонентам было проще работать в соответствии с Entity Framework.Ниже приведен один из этих методов:

        public static IQueryable<TEntity>
        QueryMany<TDbContext, TEntity, TOrder, TInclude>(TDbContext context, Expression<Func<TEntity, bool>> predicate,
            Expression<Func<TEntity, TOrder>> order, bool ascending, Expression<Func<TEntity, TInclude>> include, 
            int skipCount, int takeMax)
        where TEntity : class where TDbContext : DbContext
    {
        var query = context.Set<TEntity>().Where(predicate);

        if (include != null)
            query = query.Include(include);
        if (skipCount > 0)
            query = query.Skip(skipCount);
        if (takeMax > 0)
            query = query.Take(takeMax);
        if (order != null)
            query = ascending ? query.OrderBy(order) : query.OrderByDescending(order);

        return query;
    }

Это позволяет запрашивать множество элементов из любого типа набора в любом контексте, используя любой предикат поиска, включая любую коллекцию дочерних свойств с пропуском и выполнением функциональности в порядке возрастания илипо убыванию по любому данному свойству.Можно указать подходящие значения «по умолчанию» для параметров (например, ноль для включения и порядка, нули для пропуска / получения), чтобы выборочно включить эти биты функциональности.

Это работает хорошо, пока я не хочу включить обадети основного типа TEntity и дети типа TInclude .Я хорошо знаком с обычным многоуровневым включающим синтаксисом:

query.Include(parent => parent.Children.Select(child => child.Grandchildren)

Но, конечно же, типы аргументов шаблона в моем универсальном методе эффективно связывают его с single TEntityКоллекция дочерних свойств одного типа, TInclude.

Мой вопрос таков: есть ли способ обеспечить более обобщенную функциональность включения в моем обобщенном методе?Было бы неплохо включить произвольные многоуровневые функции включения, но пока я не нашел подходящего подхода.

ОБНОВЛЕНИЕ: я знаю, что можно также включать в себя строки, но яЯ не заинтересован в таком подходе.Я считаю, что слишком сложно надежно синхронизировать типы и строки по мере роста и развития базы кода.Пожалуйста, ограничивайте любые ответы строго синтаксисом оператора / метода LINQ.

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