C# 如何转换表达式<;Func<;TDomain,bool>&燃气轮机;谓词到表达式<;Func<;TEntity,bool>&燃气轮机;谓词,以便我可以将其传递给实体框架?
我的项目有NLayer架构 我的持久性层依赖于域层,但域层不知道实体模型 类似地,我的业务层依赖于域层,不了解实体模型 在编写业务层时,我应用了一些谓词逻辑来过滤存储库中的数据 但这个谓词逻辑是使用域模型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> :
表达式应用的,实体框架使用表达式应用的
如何转换谓词
这个问题有解决办法吗
基本存储库的实现
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兼容的方法,这破坏了整个抽象。