#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));