如何转换Expression <func <tdomain,bool =“”>&gt;谓词表达式<func <tentity,bool =“”>&gt;谓词,以便我可以将它传递给实体框架?

时间:2017-02-03 20:18:58

标签: c# entity-framework generics architecture

我的项目有NLayer架构。

enter image description here

我的持久层依赖于域层,但域层不了解实体模型。

同样,我的业务层依赖于域层,并且不了解实体模型。

在编写业务层时,我应用一些谓词逻辑来过滤存储库中的数据。

但是,使用域模型Expression<Func<TDomain, bool>>应用此谓词逻辑,而实体框架与Expression<Func<TEntity, bool>>一起使用。

如何转换谓词?

该问题是否有解决方法?

基础存储库的实施

namespace MyProject.Entity
{
    public abstract class BaseRepository<TId, TDomain, TEntity> : IRepository<TId, TDomain>
    where TId : struct
    where TDomain : class
    where TEntity : class
{
    protected readonly DbContext _dbContext;

    public BaseRepository(DbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public void Add(TDomain objDomain)
    {
        var entityObj = objDomain.MapTo<TDomain, TEntity>();
         _dbContext.Set<TEntity>().Add(entityObj);
        objDomain = entityObj.MapTo<TEntity, TDomain>();
    }

    public void AddRange(IEnumerable<TDomain> domainObjects)
    {
        var entityObjects = domainObjects.Select(x => x.MapTo<TDomain, TEntity>());
        _dbContext.Set<TEntity>().AddRange(entityObjects).ToList();
        domainObjects = entityObjects.Select(x => x.MapTo<TEntity, TDomain>());
    }

    public void Delete(TId id)
    {
        var objectToRemove = _dbContext.Set<TEntity>().Find(id);

        if (objectToRemove != null)
        { 
            _dbContext.Set<TEntity>().Remove(objectToRemove);
        }
    }

    public IEnumerable<TDomain> Find(Expression<Func<TDomain, bool>> predicate)
    {
        return _dbContext.Set<TEntity>().Where(predicate);
    }

    public TDomain Get(TId id)
    {
        return _dbContext.Set<TEntity>().Find(id).MapTo<TEntity,TDomain>();
    }

    public IEnumerable<TDomain> GetAll()
    {
        return _dbContext.Set<TEntity>().Select(x=>x.MapTo<TEntity,TDomain>()).ToList<TDomain>();
    } 


}

}

0 个答案:

没有答案