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