Repository pattern: how to implement DeleteWhere that accepts expression with Business entities
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...
}
For now it is necessary to implement method that deletes entities by expression. I would like to have开发者_StackOverflow the following method in IRepository:
void DeleteWhere(Expression<Func<IEntity, bool>> exprFoeBusinessEntity);
The problem here is that implementation would look like this:
void DeleteWhere(Expression<Func<IEntity, bool>> exprFoeBusinessEntity);
{
Expression<Func<IDbEntity, bool>> exprFoeDbEntity
= exprWhere=> ... // How to convert exprFoeBusinessEntity into exprFoeDbEntity
GetTable().DeleteAllOnSubmit(GetTable().Where(exprForDbEntity)));
}
And I don't know how to convert expression for business entities into expression for db-entities...
I could easily change method to accept expression with db-entities, but I would like my Repository to hide DBEntities inside.
Please advise. Any thoughts are welcome.
P.S. I am working with .NET 3.5 (but solutions for 4.0 are also acceptable), ORM - Linq2Sql
Guess, I've found a good solution, here is a new method for RepositoryBase class:
public void Delete(IQueryable<T> entities)
{
IQueryable<TDb> dbEntities = GetTable()
.Where(
dbEntity => entities.Where(entity => entity.Id == dbEntity.Id).Count() > 0
)
;
GetTable().DeleteAllOnSubmit(dbEntities);
}
Please point me if you see any drawbacks here.
精彩评论