Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EntityFramework repository template - how to write GetByID lambda within a template class?

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?

like image 405
nathanchere Avatar asked May 02 '26 16:05

nathanchere


1 Answers

I've defined a interface:

public interface IIdEntity
{
    long Id { get; set; }
}


And modified the t4 template which generates my POCO classes so that every class must implement the public interface IIdEntity interface.

Like this:

using System.Diagnostics.CodeAnalysis;
public partial class User : IIdEntity
{
    public virtual long Id
    {
        get;
        set;
    }

With this modification I can write a generic GetById(long id) like:

public T GetById(long id)
{
    return Single(e => e.Id == id);
}

The IRepository is defined as follows:

/// <summary>
/// Abstract Base class which implements IDataRepository interface.
/// </summary>
/// <typeparam name="T">A POCO entity</typeparam>
public abstract class DataRepository<T> : IDataRepository<T>
    where T : class, IIdEntity
{
like image 183
Stef Heyenrath Avatar answered May 05 '26 06:05

Stef Heyenrath