Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何转换表达式<;Func<;TDomain,bool>&燃气轮机;谓词到表达式<;Func<;TEntity,bool>&燃气轮机;谓词,以便我可以将其传递给实体框架?_C#_Entity Framework_Generics_Architecture - Fatal编程技术网

C# 如何转换表达式<;Func<;TDomain,bool>&燃气轮机;谓词到表达式<;Func<;TEntity,bool>&燃气轮机;谓词,以便我可以将其传递给实体框架?

C# 如何转换表达式<;Func<;TDomain,bool>&燃气轮机;谓词到表达式<;Func<;TEntity,bool>&燃气轮机;谓词,以便我可以将其传递给实体框架?,c#,entity-framework,generics,architecture,C#,Entity Framework,Generics,Architecture,我的项目有NLayer架构 我的持久性层依赖于域层,但域层不知道实体模型 类似地,我的业务层依赖于域层,不了解实体模型 在编写业务层时,我应用了一些谓词逻辑来过滤存储库中的数据 但这个谓词逻辑是使用域模型表达式应用的,实体框架使用表达式应用的 如何转换谓词 这个问题有解决办法吗 基本存储库的实现 namespace MyProject.Entity { public abstract class BaseRepository<TId, TDomain, TEntity> :

我的项目有NLayer架构

我的持久性层依赖于域层,但域层不知道实体模型

类似地,我的业务层依赖于域层,不了解实体模型

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

但这个谓词逻辑是使用域模型
表达式应用的,实体框架使用
表达式应用的

如何转换谓词

这个问题有解决办法吗

基本存储库的实现

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>();
    } 


}
名称空间MyProject.Entity
{
公共抽象类BaseRepository:IRepository
其中TId:struct
在哪里上课
地点:班级
{
受保护的只读DbContext\u DbContext;
公共基本存储库(DbContext DbContext)
{
_dbContext=dbContext;
}
公共无效添加(TDomain objDomain)
{
var entityObj=objDomain.MapTo();
_dbContext.Set().Add(entityObj);
objDomain=entityObj.MapTo();
}
public void AddRange(IEnumerable domainObjects)
{
var entityObjects=domainObjects.Select(x=>x.MapTo());
_dbContext.Set().AddRange(entityObjects.ToList();
domainObjects=entityObjects.Select(x=>x.MapTo());
}
公共作废删除(TId id)
{
var objectToRemove=_dbContext.Set().Find(id);
if(objectToRemove!=null)
{ 
_dbContext.Set().Remove(objectToRemove);
}
}
公共IEnumerable查找(表达式谓词)
{
返回_dbContext.Set(),其中(谓词);
}
公共TDomain Get(TId id)
{
返回_dbContext.Set().Find(id.MapTo();
}
公共IEnumerable GetAll()
{
返回_dbContext.Set().Select(x=>x.MapTo()).ToList();
} 
}

}

在谈到谓词之前,问题是如何将
TEntity
转换为
TDomain
?没有
DbSet
,因此您发布的大多数代码都不起作用。请参阅上面我在工作时遇到的方法,并发布了我正在处理的问题,稍后我将更新它。谢谢你好像在用汽车制版机。只要映射不太复杂,AM的
ProjectTo
方法就可以实现您想要的大部分功能。但不建议使用它将域对象映射回实体,因为这通常需要比AM中配置的规则更多的规则。@GertArnold是的,我正在使用automapper,automapper是否也转换表达式?好的,然后只需使用
DbSet().ProjectTo().Where(谓词)
。但是请注意,谓词必须只使用EF兼容的方法,这破坏了整个抽象。