2016-06-02 6 views
0

У меня есть рабочий репозиторий.Добавить Включить в репозиторий

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 

чем проблема здесь, пожалуйста.

+0

Вы используете System.Linq; 'и' using System.Data.Entity; 'в вашем файле кода? – Ash

+0

Этот метод добавляется в класс репозитория? –

+0

@Ashwin Nair. Я использую их уже, иначе, даже при прямом использовании контекста не будет работать. –

ответ

0

Снова благодаря @Adam Carr.

Это метод Теперь код:

public IQueryable<TEntity> Include(params Expression<Func<TEntity, object>>[] includeExpressions) 
{ 
    IDbSet<TEntity> dbSet = Context.Set<TEntity>(); 

    IQueryable<TEntity> query = null; 
    foreach (var includeExpression in includeExpressions) 
    { 
     query = dbSet.Include(includeExpression); 
    } 

    return query ?? dbSet; 
} 

Что я могу изменить это использовать Set как метод не является свойством. Таким образом, вместо того, чтобы:

IDbSet<TEntity> dbSet = Context.Set<TEntity>; 

Я использовал:

IDbSet<TEntity> dbSet = Context.Set<TEntity>(); 

Кроме того, я использовал IQueryable вместо IEnumerable.

+0

Так ответ AdamCarrs должен был быть принят? – Anytoe

2

Я подозреваю, что ваш код передается в выражении лямбда в параметр IDbSet и не может преобразовать его в этот тип.

Я не смог проверить, но он компилируется, если этот метод является членом класса репозитория, тогда попробуйте это.

public IEnumerable<TEntity> Include(params Expression<Func<TEntity, object>>[] includes) 
{ 
    IDbSet<TEntity> dbSet = Context.Set<TEntity>(); 

    IEnumerable<TEntity> query = null; 
    foreach (var include in includes) 
    { 
     query = dbSet.Include(include); 
    } 

    return query ?? dbSet; 
} 
+0

Не удалось скомпилировать. ошибка: ** не может преобразовать группу методов «Установить» в тип без делегата ** –

+0

Да, это была типичная ошибка! Я обновил с исправлением. –

+0

Пожалуйста, помогите мне включить более одного объекта. С помощью этого метода я могу включить только одно сущность. Теперь мне нужно включить три объекта через репозиторий. Ждем вас от вас. Благодарю. –