【问题标题】:Entity Framework using Generic Predicates使用通用谓词的实体框架
【发布时间】:2009-12-14 06:13:43
【问题描述】:

我使用 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 子句无法从用法中推断出来。如果我在表达式中使用具体类型,那么它可以找到,但我不想将我的业务层直接暴露给 EF。

【问题讨论】:

    标签: entity-framework lambda repository-pattern


    【解决方案1】:

    尝试将 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 insteadFetchAll 似乎不需要了解整个规范,它只需要谓词,对吗?如果您需要将其转换为 IClassDTO,请在列表中获得结果后执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      相关资源
      最近更新 更多