应用表达式<func <tentity,bool =“”>&gt;在通用存储库中?

时间:2017-04-14 07:40:48

标签: c# entity-framework-4 repository-pattern

目前,我有一个像这样的Generic存储库:

    public virtual IQueryFluent<TEntity> Query(Expression<Func<TEntity, bool>> query)
    {
        return new QueryFluent<TEntity>(this, query);
    }

并按照以下方式实施:

    var obj = _repository.Query(x => x.RoleID == ID).Select().FirstOrDefault();

因为,RoleID出现在所有实体中,所以我想在Generic Repository中构建一个Expression common,如下所示:

    //Check and get RoleID if exist this column
    PropertyInfo info = typeof(TEntity).GetProperty("RoleID");
    if (info != null) 
        Expression<Func<TEntity, bool>> filter = (p => p.RoleID ??? or p.info ??? == 5);

我们如何在Generic Repository中使用TEntity中的未知列构建过滤器?或者我们可以为Filter传递一串where子句吗?

我的目的是,我只需要具有简单结构的查询数据:

    var obj = _repository.Query().Select().FirstOrDefault();

请告知。

感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用界面修改具有RoleID的实体,例如:

interface IEntity { }
interface IRoleIdentifiedEntity : IEntity
{
    int RoleID { get; }
}

对于所有实体,请使用通用存储库:

class GenericRepository<T> where T : IEntity
{
    public IEnumerable<T> Query(Expression<Func<T, bool>> predicate)
    {
        throw new NotImplementedException();
    }
}

对于IRoleIdentifiedEntity的实体,请使用其他存储库:

class RoleIdentifiedRepositoryBase<T> : GenericRepository<T>
    where T : IRoleIdentifiedEntity
{
    public IEnumerable<T> Query(int id)
    {
        return Query(e => e.RoleID == id);
    }
}