Шаблон репозитория: как реализовать DeleteWhere, который принимает выражения с бизнес-объектами - PullRequest
2 голосов
/ 17 декабря 2010
public interface IRepository<T>// : IDisposable
    where T : IEntity
{
    IQueryable<T> GetAll();
    void Save(T entity);
    void Delete(int id);
    void Delete(T entity);
}

public abstract class RepositoryBase<T, TDb> : IRepository<T>
    where T : IEntity
    where TDb : class, IDbEntity, new()
{
    protected abstract Table<TDb> GetTable();

    public void Delete(int id)
    {
        TDb dbEntity = GetDbEntity(id);

        if (dbEntity == null)
        {
            throw new MyException(...);
        }

        GetTable().DeleteOnSubmit(dbEntity);

        Context.SubmitChanges();
    }

    //  and other methods...   
}

Пока необходимо реализовать метод, который удаляет сущности по выражению. Я хотел бы иметь следующий метод в IRepository:

void DeleteWhere(Expression<Func<IEntity, bool>> exprFoeBusinessEntity);

Проблема здесь в том, что реализация будет выглядеть так:

void DeleteWhere(Expression<Func<IEntity, bool>> exprFoeBusinessEntity);
{
    Expression<Func<IDbEntity, bool>> exprFoeDbEntity 
        = exprWhere=> ... // How to convert exprFoeBusinessEntity into exprFoeDbEntity

    GetTable().DeleteAllOnSubmit(GetTable().Where(exprForDbEntity)));
}

И я не знаю, как преобразовать выражение для бизнес-сущностей в выражение для db-entity ...

Я мог бы легко изменить метод для принятия выражения с db-entity, но я бы хотел, чтобы мой репозиторий скрывал DBEntities внутри.

Пожалуйста, сообщите. Любые мысли приветствуются.

P.S. Я работаю с .NET 3.5 (но решения для 4.0 тоже приемлемы), ORM - Linq2Sql

1 Ответ

0 голосов
/ 17 декабря 2010

Думаю, я нашел хорошее решение, вот новый метод для класса RepositoryBase:

    public void Delete(IQueryable<T> entities)
    {
        IQueryable<TDb> dbEntities = GetTable()
            .Where(
                dbEntity => entities.Where(entity => entity.Id == dbEntity.Id).Count() > 0
                  )
            ;
        GetTable().DeleteAllOnSubmit(dbEntities);
    }

Пожалуйста, укажите мне, если вы видите здесь какие-либо недостатки.

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