如何将Expression类型的lambda转换为更具体的?

时间:2016-04-27 12:20:54

标签: c# linq nhibernate expression-trees linq-to-nhibernate

某些背景:

我的数据访问层向我的服务层公开了一个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;

我理解这一点,但我无法解决这个问题......

0 个答案:

没有答案