Last active
August 13, 2017 08:11
-
-
Save reciosonny/a5ab27b8f885b14faf86fc21df992e95 to your computer and use it in GitHub Desktop.
Generic implementation of repository pattern
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class GenericRepository<T> : Repository, IRepository<T> | |
where T : class { | |
public GenericRepository(DbContext db) : base(db) { } | |
internal DbSet<T> _table | |
{ | |
get | |
{ | |
return _db.Set<T>(); | |
} | |
} | |
/// <summary> | |
/// Gets entity tables as a whole for repository querying | |
/// </summary> | |
public IQueryable<T> Query | |
{ | |
get | |
{ | |
return _table.AsQueryable(); | |
} | |
} | |
public void Add(T entity) { | |
_table.Add(entity); | |
//throw new NotImplementedException(); | |
} | |
//Refer to this for various update strategy: https://stackoverflow.com/questions/15336248/entity-framework-5-updating-a-record | |
public void Update(T entity) { | |
_db.Entry(entity).State = EntityState.Modified; | |
} | |
public T GetFirstItem() { | |
return _table.First(); | |
//throw new NotImplementedException(); | |
} | |
//public IQueryable<T> GetAllItems() { | |
// throw new NotImplementedException(); | |
//} | |
/// <summary> | |
/// Note: 2 overloads present in where method | |
/// -Expression which uses IQueryable as return value | |
/// Both of them is okay, but IQueryable is much lighter as it returns SQL statement compared to IEnumerable which queries from database and store data in an object | |
/// </summary> | |
/// <param name="expression"></param> | |
/// <returns></returns> | |
public T GetItem(Expression<Func<T, bool>> expression) { | |
return _table.Where(expression).First(); | |
//throw new NotImplementedException(); | |
} | |
/// <summary> | |
/// This implementation uses IEnumerable when we get the first item. So this one queries first into the database | |
/// </summary> | |
/// <param name="expression"></param> | |
/// <returns></returns> | |
public T GetItem(Func<T, bool> expression) { | |
return _table.Where(expression).First(); | |
} | |
public T GetItem(int id) { | |
return _table.Find(id); | |
//throw new NotImplementedException(); | |
} | |
public IQueryable<T> FindAllItems(Expression<Func<T, bool>> aggregate) { | |
return _table.Where(aggregate); | |
//throw new NotImplementedException(); | |
} | |
public void Remove(T entity) { | |
_table.Remove(entity); | |
//throw new NotImplementedException(); | |
} | |
public void RemoveRange(IEnumerable<T> entity) { | |
_table.RemoveRange(entity); | |
} | |
public virtual IEnumerable<T> Get( | |
Expression<Func<T, bool>> filter = null, | |
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, | |
string includeProperties = "") { | |
IQueryable<T> query = _table; | |
if (filter != null) { | |
query = query.Where(filter); | |
} | |
foreach (var includeProperty in includeProperties.Split | |
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { | |
query = query.Include(includeProperty); | |
} | |
if (orderBy != null) { | |
return orderBy(query).ToList(); | |
} | |
else { | |
return query.ToList(); | |
} | |
} | |
/// <summary> | |
/// note: SaveChanges implementation was removed in repository since we implemented Unit Of Work pattern. Noticed that we have actually | |
/// </summary> | |
/// <param name="entity"></param> | |
/// <returns></returns> | |
//public void SaveChanges() { | |
// _db.SaveChanges(); | |
//} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Repository { | |
protected DbContext _db = null; //= new NorthwindEntityFrameworkEntities(); | |
public Repository(DbContext db) { | |
_db = db; | |
} | |
protected IQueryable<Employee> Employees | |
{ | |
get | |
{ | |
return _db.Set<Employee>(); | |
} | |
} | |
protected IQueryable<Payroll> Payroll | |
{ | |
get | |
{ | |
return _db.Set<Payroll>(); | |
} | |
} | |
protected IQueryable<PayrollHistory> PayrollHistory | |
{ | |
get | |
{ | |
return _db.Set<PayrollHistory>(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment