У меня есть рабочий репозиторий.Добавить Включить в репозиторий
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
protected readonly DbContext Context;
public Repository(DbContext context)
{
Context = context;
}
public TEntity Get(int id)
{
return Context.Set<TEntity>().Find(id);
}
public IEnumerable<TEntity> GetAll()
{
return Context.Set<TEntity>().ToList();
}
public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
return Context.Set<TEntity>().Where(predicate);
}
public TEntity SingleOrDefault(Expression<Func<TEntity, bool>> predicate)
{
return Context.Set<TEntity>().SingleOrDefault(predicate);
}
public void Add(TEntity entity)
{
Context.Set<TEntity>().Add(entity);
}
public void Remove(TEntity entity)
{
Context.Set<TEntity>().Remove(entity);
}
}
Как я прочитал в кодирующих хранилищах, что вы не добавить любой класса, пока вы действительно не нужны. Теперь мне нужно добавить Включить. Я нашел это в этом сообществе Use Include() method in repository:
public static class IncludeExtension
{
public static IQueryable<TEntity> Include<TEntity>(this IDbSet<TEntity> dbSet,
params Expression<Func<TEntity, object>>[] includes)
where TEntity : class
{
IQueryable<TEntity> query = null;
foreach (var include in includes)
{
query = dbSet.Include(include);
}
return query ?? dbSet;
}
}
Затем я изменил его, чтобы поместиться в моем коде (как я думаю) быть:
public IEnumerable<TEntity> Include(IDbSet<TEntity> dbSet,
params Expression<Func<TEntity, object>>[] includes)
{
IEnumerable<TEntity> query = null;
foreach (var include in includes)
{
query = dbSet.Include(include);
}
return query ?? dbSet;
}
С прямым доступом к контексту, я могу написать:
Provinces = _cmsDbContext.Provinces.Include(c => c.District).Include(c => c.District.Country).ToList();
Но, с репозиторием, я не могу написать:
Provinces = Currentunitofwork.ProvinceRepository.Include(c => c.District).Include(c => c.District.Country).ToList();
я получил ошибку:
cannot convert lambda expression to type IDbSet<Province> because it is not a delegate type
чем проблема здесь, пожалуйста.
Вы используете System.Linq; 'и' using System.Data.Entity; 'в вашем файле кода? – Ash
Этот метод добавляется в класс репозитория? –
@Ashwin Nair. Я использую их уже, иначе, даже при прямом использовании контекста не будет работать. –