某些背景:
我的数据访问层向我的服务层公开了一个IQueryable(我知道它很顽皮,但这不是我的决定)。我在我的数据访问层中使用了nHibernate,我想指定属性来急切获取但是我不想在服务层中使用NHibernate.Linq扩展方法。我更愿意隐藏抽象背后的东西。
这就是抽象,一个名为QueryBuilder的类。
它有一个接受IQueryable的构造函数。
public QueryBuilder(IQueryable<TEntity> query)
{
this.query = query;
}
接受eager的属性的方法:
public QueryBuilder<TEntity> EagerFetch(params Expression<Func<TEntity, object>>[] fetchExpressions)
{
this.expressionPaths = this.ParseExpressions(fetchExpressions);
return this;
}
ParseExpressions接受那些fetchExpressions,将它们分解,删除重复项并将它们存储为:
List<Expression>
这是一个如何调用它的例子:
Human human = this.humanRepository.Execute(
new QueryBuilder<Human>(query).EagerFetch(h => h.LimbsList,
h => h.LimbsList.First().DigitsList.First().Nail)).Single();
ParseExpressions方法将此转换为以下内容:
x => x.LimbsList
x => x.DigitsList
x => x.Nail
所以下一步是将这些附加到我的IQueryable。例如
this.query.Fetch(x => x.LimbsList).ThenFetchMany(x => x.DigitsList).ThenFetch(x => x.Nail);
问题
如何将每个表达式转换为nHibernate Fetch,FetchMany,ThenFetch和ThenFetchMany函数接受的任何内容?
编译器告诉我:
&#34;方法的类型参数 &#39;&NHibernate.Linq.EagerFetchingExtensionMethods.Fetch LT; TOriginating,TRelated&GT;(System.Linq.IQueryable&LT; TOriginating&gt;中 System.Linq.Expressions.Expression&LT; System.Func&LT; TOriginating,TRelated&GT;&GT;)&#39; 无法从使用中推断出来。尝试指定类型参数 明确&#34;
我理解这一点,但我无法解决这个问题......