2012-02-15 122 views
4

类似下面的构造是否可行?是否有可能拥有一个Func的参数阵列

public IQueryable<T> AllWithFetch<TRelated>(IQueryable<T> existing, params Expression<Func<T, TRelated>>[] fetchExpressions) 
    { 
    return fetchExpressions.Aggregate(existing, (current, exp) => current.Fetch(exp)); 
    } 

然后可以这样调用...

var allDetails = this.preGrantDetailRepository 
       .AllWithFetch(this.preGrantDetailRepository.All, x => x.Case, x => x.CaseOwner) 

基本上我想包括增加抓取,NHibernate的战略,我们的抽象资源库,使我们能够从指定这些策略我们的逻辑层没有破坏存储库模式。例如,如果我们从NHibernate更改为另一个ORM,那么我们可以提供相同的存储库方法,但实现该ORM。

当我尝试链接param数组中的多个func时,会出现问题。

所以此工程...

var allDetails = this.preGrantDetailRepository 
       .AllWithFetch(this.preGrantDetailRepository.All, x => x.Case) 

但这种失败的messge

var allDetails = this.preGrantDetailRepository 
       .AllWithFetch(this.preGrantDetailRepository.All, x => x.Case, x => x.CaseOwner) 

我使用.NET 3.5,存储库模式 “的类型参数不能从他们的使用推断” ,功能NHibernate,SQL Server 2008中

编辑

我在下面Porges的帮助下解决了这个问题,所以我已经准备好了。问题确实来自TRelated的错误使用。下面是资源库中的工作方法......

public IQueryable<T> AllWithFetch<T>(IQueryable<T> existing, params Expression<Func<T, Entity>>[] fetchExpressions) 
     { 
      return fetchExpressions.Aggregate(existing, (current, exp) => current.Fetch(exp)); 
     } 

它现在AllWithFetch不TRelated,我使用的函数功能超类的两个实体(案例& CaseOwner)。

感谢您的帮助球员

+0

'.Case'和'.CaseOwner'的返回类型是什么? – AakashM 2012-02-15 10:33:03

回答

4

的问题是你TRelated,这不是什么关系params明确。

试试这个,例如:

void DoSomething<T,U>(Func<T,U> f, Func<T,U> f2) 
{ 
} 

void Main() 
{ 
    DoSomething((int x) => x + 1, (int x) => x + ""); 
} 

编译器会推断T必须int,但不能推断出良好类型U(我不知道的确切细节,但它通常不会在继承链上寻找更高的类型)。

为了使它起作用,您需要指定超类;在这种情况下,object

void Main() 
{ 
    DoSomething<int,object>((int x) => x + 1, (int x) => x + ""); 
} 

所以你要么需要指定自己一个超类(这看起来将是object这里),或只是摆脱TRelated参数。

2

你应该TRelated为每个FUNC返回值。 .Case和.CaseOwner的类型是否相同?如果没有,你可以使用

Func<T, object> 

代替(或任何界面)

相关问题