Как использовать 2 выражения в шаблоне репозитория EF

#entity-framework #repository-pattern

Вопрос:

У меня есть этот метод в моем общем классе репозитория EF

 public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    public async Task<IEnumerable<T>> GetAllByExpression<T>(Expression<Func<T, bool>> expression,
        Expression<Func<T, object>>[] includes) where T : class
    {
        if (expression != null)
        {
            IQueryable<T> query = context.Set<T>();
            foreach(var include in includes)
            {
                query = query.Include(include);
            }

            var result = await query.Where(expression)
                .ToListAsync();

            return resu<
        }
        else
        {
            throw new ArgumentNullException("Invalid expression.");
        }
    }
}
 

Я не знаю, как использовать «Включить» к нему. В основном то, что я хочу получить, похоже на это =>

 return await context.PropertyChargesRates.Where(x => x.BuildingId == buildingId)
                    .Include(x => x.PropertyChargeType)
                    .ToListAsync();
 

Вот как я пытаюсь использовать эту функцию:

 public async Task<IEnumerable<PropertyChargesRate>> GetPropertyChargeRates(int buildingId)
        {
            try
            {
                var g = new GenericRepository<PropertyChargesRate>(context);
                var result = g.GetAllByExpression<PropertyChargesRate>(x => x.BuildingId == buildingId, ** CANT FIGURE OUT HOW TO CALL THIS PART YET **);

                return resu<
            }
            catch (Exception ex)
            {
                return null;
            }
        }
 

Ответ №1:

Реализация, которую вы ищете, может выглядеть следующим образом:

         public IEnumerable<T> GetAllByExpression<T>(
         YourDBContext  context,
         Expression<Func<T, bool>> expression,
         Func<IQueryable<T>, IQueryable<T>> includes) where T : class
    {
        if (expression != null)
        {
            IQueryable<T> query = context.Set<T>();
            query = includes(query);

            var result = query.Where(expression)
                              .ToList();
            return resu<
        }

        throw new ArgumentNullException(nameof(expression), "Invalid expression.");
    }
 

И использование будет выглядеть так:

 repository.GetAllByExpression<YourEntity>   
         (YourDbContext,
         YourWhereExpression,
         (q)=> q.Include(i=> i.YourInclude1)
                .Include(i2=> i2.YourInclude2));