【问题标题】:Apply Expression<Func<TEntity, bool>> in Generic Repository?在通用存储库中应用 Expression<Func<TEntity, bool>>?
【发布时间】:2017-09-10 11:09:00
【问题描述】:

目前,我有一个这样的通用存储库:

    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 出现在所有实体中,所以我想像这样在通用存储库中构建一个通用的表达式:

    //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);

我们如何在通用存储库的 TEntity 中构建一个包含未知列的过滤器?或者我们可以为Filter传递一个where子句的字符串吗?

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

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

请指教。

谢谢。

【问题讨论】:

  • 最好是在所有实体上实现一些接口,如IHasRole {int RoleID{get;set;}} 并使用它。
  • 感谢 Evk 的帮助。

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


【解决方案1】:

您可以使用接口修改具有 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);
    }
}

【讨论】:

  • 嗨 Danny Chen,我的 RoleID 是由 .edmx 创建的,它是 SQL 中的一列表。我们可以使用反射器来获取属性信息并进行处理吗?
  • @Langthang 这不是问题,因为从 .edmx 生成的类是部分的,因此您可以使用接口扩展它们而无需修改自动生成的文件。
  • @Langthang 反射在这种情况下无济于事。正如 Evk 所说,您可以使用部分类。
  • 非常感谢 Danny 和 Evk,我会尝试应用您的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多