2016-06-02 15 views
0

Ich habe ein funktionierendes Repository.Hinzufügen zum Repository hinzufügen

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

Wie ich in Coding-Repositorys lese, dass Sie keine Klasse hinzufügen, bis Sie es wirklich brauchen. Jetzt muss ich hinzufügen Include. Ich fand diese in dieser Gemeinschaft 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; 
    } 
} 

Dann habe ich es in meinem Code zu passen (wie ich glaube) zu sein:

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; 
} 

Mit direktem Zugang zum Kontext, ich bin in der Lage zu schreiben:

Provinces = _cmsDbContext.Provinces.Include(c => c.District).Include(c => c.District.Country).ToList(); 

Aber mit Repository, kann ich nicht schreiben:

Provinces = Currentunitofwork.ProvinceRepository.Include(c => c.District).Include(c => c.District.Country).ToList(); 

Ich habe Fehler:

cannot convert lambda expression to type IDbSet<Province> because it is not a delegate type 

Was ist das Problem hier ist, bitte.

+0

Verwenden Sie System.Linq; und 'using System.Data.Entity;' in Ihrer Codedatei? – Ash

+0

Wird diese Methode der Repository-Klasse hinzugefügt? –

+0

@ Ashwin Nair. Ich benutze sie bereits, sonst wird auch bei direkter Verwendung von Kontext nicht funktionieren. –

Antwort

0

Nochmals dank @Adam Carr.

Dies ist die Methode Code jetzt:

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; 
} 

Was ich ändern ist verwenden Set als Methode keine Eigenschaft. Anstatt also:

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

I verwendet:

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

Auch benutzte ich IQueryable statt IEnumerable.

+0

Also sollte AdamCarrs Antwort die akzeptierte sein? – Anytoe

2

Ich vermute, dass Ihr Code den Lambda-Ausdruck an den IDbSet-Parameter übergeben und nicht in diesen Typ konvertieren kann.

Ich konnte nicht testen, aber es kompiliert, wenn die Methode ein Mitglied der Repository-Klasse ist, versuchen Sie es dann.

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

Konnte nicht kompiliert werden. error: ** kann nicht konvergieren Methodengruppe 'Setzen' auf Nicht-Delegieren Typ ** –

+0

Ja das war ein Tippfehler! Ich habe mit der Korrektur aktualisiert. –

+0

Bitte, hilf mir, mehr als eine Entität einzubeziehen. Mit dieser Methode kann ich nur eine Entität einschließen. Jetzt muss ich drei Entitäten durch das Repository einschließen. Freue mich von Dir zu hören. Vielen Dank. –