使用通用谓词的实体框架
问题描述:
我使用DTO来通过存储库模式在我的业务和实体框架图层之间进行映射。使用通用谓词的实体框架
的一个标准调用看起来像
public IClassDTO Fetch(Guid id)
{
var query = from s in _db.Base.OfType<Class>()
where s.ID == id
select s;
return query.First();
}
现在,我想在过滤条件通过从业务层,所以我尝试
public IEnumerable<IClassDTO> FetchAll(ISpecification<IClassDTO> whereclause)
{
var query = _db.Base.OfType<Class>()
.AsExpandable()
.Where(whereclause.EvalPredicate);
return query.ToList().Cast<IClassDTO>();
}
从业务层的调用会是这样的
Specification<IClassDTO> school =
new Specification<IClassDTO>(s => s.School.ID == _schoolGuid);
IEnumerable<IClassDTO> testclasses = _db.FetchAll(school);
我遇到的问题是EF查询中的.WHER子句不能从使用中推断出来。如果我在Expression中使用具体类型,那么它可以找到,但我不想直接将我的业务层展示给EF。
答
尝试制作使用fetchall到一个通用的一类,而不是像这样: -
public IEnumerable<T> FetchAll<T> (Expression<Func<T,bool>> wherePredicate)
where T:IClassDTO //not actually needed
{
var query = _db.Base.OfType<T>()
.AsExpandable()
.Where(wherePredicate);
return query;
}
传中school.Evalpredicate instead
。 FetchAll
似乎不需要知道整个规范,它只需要谓词,对吗?如果您需要将其转换为IClassDTO
,请在列表中显示结果后执行此操作。