我正在尝试向我的通用存储库添加一个方法,该方法允许我通过它的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;
}