Создайте общий репозиторий для приложения Entity Framework - PullRequest
2 голосов
/ 30 июня 2010

Я пытаюсь написать общий репозиторий для моего приложения на основе Entity Framework.Вот мой код прототипа:

Интерфейс

public interface IDomainRepository
    {
        T GetById<T>(int id, Expression<Action<T>> idx)
    }

и хранилище:

public class DomainRepository : IDomainRepository
    {
        private readonly DatabaseDataContext _ctx;

        public DomainRepository(DatabaseDataContext ctx)
        {
            _ctx = ctx;
        }

        public T GetById<T>(int id, Expression<Action<T>> idx)
        {
            return _ctx.GetTable(typeof (T)).SingleOrDefault(idx);
        }
    }

Выше приведен тестовый код, который не работает,Но то, что я хотел бы сделать, это:

var repository = new DomainRepository(myContext);

var client = repository.GetById<tbl_Clients>(23, c => c.clientId);

Итак, я хочу получить клиентскую сущность из базы данных, передав идентификатор и лямбду, сообщающую GetById, какой идентификаторстолбец есть.Кроме того, я понятия не имею, как бы я выполнял лямбду, используя переданный идентификатор.

Может кто-нибудь помочь мне с этим?

РЕДАКТИРОВАТЬ:

Я действительно близко.Я изменил GetById:

public T GetById<T>(int id, Expression<Func<T, object>> idx)

, и теперь я могу назвать его так:

var g = repository.GetById<tbl_Client>(23, c => c.cl_id);

, но я не знаю, как использовать idx и проверить его значениепереданный идентификатор:

 public T GetById<T>(int id, Expression<Func<T, object>> idx)
        {
            //var col = idx.Compile().Invoke(T);
           // How do I check if the column passed to "idx" is equal to id?

            return default(T);
        }

РЕДАКТИРОВАТЬ: думаю, я получил это работает сейчас.Вот весь мой код плюс тест:

public interface IDomainRepository
    {
        T GetById<T>(int id, Expression<Func<T, object>> idx) where T : class;

        IEnumerable<T> GetAll<T>() where T : class;
        IEnumerable<T> Query<T>(Expression<Func<T, bool>> filter) where T : class;
        IEnumerable<T> Query<T>(ISpecification<T> filter) where T : class;

        void Add<T>(T entity) where T : class;
        void Delete<T>(T entity) where T : class;
        Table<T> GetTable<T>() where T : class;
    }

public class DomainRepository : IDomainRepository
    {
        private readonly DatabaseDataContext _ctx;

        public DomainRepository(DatabaseDataContext ctx)
        {
            _ctx = ctx;
        }

        public T GetById<T>(int id, Expression<Func<T, object>> idx) where T : class
        {
            return (from i in GetAll<T>()
                    let h = idx.Compile().Invoke(i)
                    where Convert.ToInt32(h) == id
                    select i).SingleOrDefault();
        }

        public IEnumerable<T> GetAll<T>() where T : class
        {
            return GetTable<T>().ToList();
        }

        public IEnumerable<T> Query<T>(Expression<Func<T, bool>> filter) where T : class
        {
            return GetTable<T>().Where(filter);
        }

        public IEnumerable<T> Query<T> (ISpecification<T> filter) where T : class
        {
            return GetTable<T>().Where(filter.Predicate);
        }

        public void Add<T> (T entity) where T : class
        {
            GetTable<T>().InsertOnSubmit(entity);
        }

        public void Delete<T> (T entity) where T : class
        {
            GetTable<T>().DeleteOnSubmit(entity);
        }

        public Table<T> GetTable<T>() where T : class
        {
            return _ctx.GetTable(typeof(T)) as Table<T>;
        }
    }


var repository = new DomainRepository(_ctx);

var g = repository.GetById<tbl_Client>(1, c => c.cl_id);

Я буду продолжать тестировать это, чтобы проверить, все ли в порядке.

Приветствия.Иак.

Ответы [ 2 ]

0 голосов
/ 30 июня 2010

ОК, я думаю, что у меня есть финальная версия, но мне нужно немного больше тестировать:

public T GetById<T>(int id, Func<T, int> idx) where T : class
        {
            return (from i in GetAll<T>()
                    where idx(i) == id
                    select i).SingleOrDefault();
        }
0 голосов
/ 30 июня 2010

Вы можете просто представить IQueryable через слои.

IQueryable Users {get;}

Таким образом, вы можете сделать что-то подобное в своем коде пользовательского интерфейса:

BLLContext.Users.Where (c => c.Username == "foo");

BLLContext будет иметь базовый контекст DAL, который предоставляет IQueryable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...