Creating a generic repository where Type T is specified

526 Views Asked by At

I am trying to write a generic repository which uses a base repository but has methods for a particular sub set of poco objects which contain PersonId. Is there a way to use lamda expressions where I specify type T in the declaration as BasePersonItem but then use type T in a linq expression? At the moment I am just getting a compiler error:

BasePersonRepository.cs(45,45): Error CS1061: Type `ServiceStack.OrmLite.SqlExpression<T>' does not contain a definition for `PersonId' and no extension method `PersonId' of type `ServiceStack.OrmLite.SqlExpression<T>' could be found. Are you missing an assembly reference? (CS1061) (TribeGuru.Database.Repository)

I cant see a way to tell the function that T is of type base person item other than the way it is implemented?

[DataContract]
public class BasePersonItem : BaseItem
{
    public BasePersonItem ()
    {
    }

    [Alias("person_id")]
    [DataMember]
    public int PersonId { get; set; }
}

public class BaseRepository<T> : IBaseRepository<T> where T : class
{
    private IDbConnectionFactory _connectionFactory;

    public BaseRepository ()
    {
        var connection = ConfigurationManager.ConnectionStrings ["bob"].ConnectionString;
        _connectionFactory = new OrmLiteConnectionFactory (connection, MySqlDialect.Provider);
    }

    protected IDbConnection GetConnection()
    {
        return _connectionFactory.OpenDbConnection ();
    }
}

public class BasePersonRepository<T> : BaseRepository<T> where T : BasePersonItem 
{
    public BasePersonRepository ()
    {
    }

    public List<T> GetByPersonId (int personId)
    {
        using (var cn = GetConnection ())
        {
            return cn.Select<T> (c => c.PersonId = personId).ToList ();
        }
    }
}

0

There are 0 best solutions below