I am trying to write a generic one-size-fits-most repository pattern template class for an Entity Framework-based project I’m currently working on. The (heavily simplified) interface is:
internal interface IRepository<T> where T : class
{
T GetByID(int id);
IEnumerable<T> GetAll();
IEnumerable<T> Query(Func<T, bool> filter);
}
GetByID is proving to be the killer. In the implementation:
public class Repository<T> : IRepository<T>,IUnitOfWork<T> where T : class
{
// etc...
public T GetByID(int id)
{
return this.ObjectSet.Single<T>(t=>t.ID == id);
}
t=>t.ID == id is the particular bit I’m struggling with. Is it even possible to write lambda functions like that within template classes where no class-specific information is going to be available?
I’ve defined a interface:
And modified the t4 template which generates my POCO classes so that every class must implement the public interface IIdEntity interface.
Like this:
With this modification I can write a generic GetById(long id) like:
The IRepository is defined as follows: