我使用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查询中的.Where子句。如果我在Expression中使用具体类型,那么它可以找到但我不想直接将我的业务层公开给EF。
答案 0 :(得分:0)
尝试将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
,请在将结果放入列表后执行此操作。