2010-12-17 52 views
2
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下面的方法:存儲庫模式:如何實現DeleteWhere接受業務實體的表達式

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實體的表達,但我希望我的存儲庫隱藏DBEntities裏面。

請指教。任何想法都歡迎。

P.S.我與.NET 3.5的工作(但4.0的解決方案也是可以接受的),ORM - LINQ2SQL

回答

0

猜,我已經找到了一個很好的解決辦法,這裏是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); 
    } 

請指出,如果你在這裏看到任何缺點。