通用存储库GetByID方法,使用"包括" ....

时间:2016-02-12 03:58:46

标签: c# entity-framework generics

我正在尝试向我的通用存储库添加一个方法,该方法允许我通过它的PrimaryKey(ID)查询实体,并选择要返回的导航属性。踢球者是,为了真正通用,我不知道主键的数据类型或字段名称(不支持复合键......)。

所以这就是我开始的内容......下面的代码片段根据密钥获取了TEntity,无论密钥的类型如何......

 public virtual TEntity GetByID(Object entityID)
 {
     TEntity ret = DbSet.Find(entityID);
     return ret;
 }

下一步是重新获取记录,但包括我选择包含的任何导航字段......这对于多个记录来说非常有用......

    public virtual IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] includedProperties)
    {
        var query = DbSet.AsQueryable();

        foreach (var prop in includedProperties)
        {
            query = query.Include(prop);
        }

        return query;
    }

   //
   // example usage gets ALL books including Author and Publisher information
   var repo = uow.GetRepository<Book>();
   repo.GetAllIncluding(e=>e.Author, e=>e.Publisher);

所以现在我需要把两者混合......这就是摩擦。为了动态添加&#34;包括&#34;表达式我需要将DbSet转换为IQueryable ...但是为了利用类型不可知的键查找,我需要使用&#34; Find()&#34; DbSet上的方法...

所以理论上我需要将DbSet转换为IQueryable,添加Include表达式然后将IQueryable BACK转换为DbSet,这样我就可以访问类型不可知的&#34; Find()&#34;方法......这不起作用......

任何人都对如何做到这一点有任何想法...... ??

这里有一些我正在努力工作的伪代码......

    public virtual TEntity GetByID(Object entityID, params Expression<Func<TEntity, object>>[] includedProperties)
    {
        var query = DbSet.AsQueryable();

        foreach (var prop in includedProperties)
        {
            query = query.Include(prop);
        }


        TEntity ret = ((DbSet)query).Find(entityID);
        return ret;
    }

0 个答案:

没有答案