HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

BaseRepository for EF6

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
ef6forbaserepository

Problem

Is this okay?

public class BaseRepository where T : class
{
    private readonly DbContext _dbContext;

    public BaseRepository(DbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public T Get(Func predicate)
    {
        return GetAll(predicate).FirstOrDefault();
    }

    public IEnumerable GetAll(Func predicate = null)
    {
        IEnumerable result = _dbContext.Set().AsEnumerable();
        return (predicate == null) ? result : result.Where(predicate);
    }

    public void Add(T entity)
    {
        _dbContext.Entry(entity).State = EntityState.Added;
    }

    public void Delete(Func predicate)
    {
        IEnumerable entities = GetAll(predicate);
        foreach (T entity in entities)
            _dbContext.Entry(entity).State = EntityState.Deleted;
    }

    public void Delete(T entity)
    {
        _dbContext.Entry(entity).State = EntityState.Deleted;
    }

    public void Update(T entity)
    {
        _dbContext.Entry(entity).State = EntityState.Modified;
    }

    public async void Save()
    {
        await _dbContext.SaveChangesAsync();
    }

    public void Dispose()
    {
        if (_dbContext != null)
            _dbContext.Dispose();
    }
}

Solution

It seems strange to me for Get to be a specific way of getting all items, and GetAll should always return all items. Introduce a GetSome helper for clarity.

public T Get(Func predicate) {
    return GetWhere(predicate).FirstOrDefault();
}

public IEnumerable GetAll() {
    return GetWhere(null);
}

public IEnumerable GetWhere(Func predicate) {
    IEnumerable result = _dbContext.Set().AsEnumerable();
    return (predicate == null) ? result : result.Where(predicate);
}



Caveat: I don't write C# so perhaps this doesn't match the standard pattern there.

Code Snippets

public T Get(Func<T, bool> predicate) {
    return GetWhere(predicate).FirstOrDefault();
}

public IEnumerable<T> GetAll() {
    return GetWhere(null);
}

public IEnumerable<T> GetWhere(Func<T, bool> predicate) {
    IEnumerable<T> result = _dbContext.Set<T>().AsEnumerable();
    return (predicate == null) ? result : result.Where<T>(predicate);
}

Context

StackExchange Code Review Q#51095, answer score: 5

Revisions (0)

No revisions yet.