2010-07-30 12 views
3

J'ai 3 méthodes qui sont presque exactement identiques:Comment passer une expression à une méthode comme une variable?

protected DetachedCriteria GetAvailableFundIdsPerDataUniverse() 
{ 
    return GetAvailableIdsPerDataUniverse() 
     .SetProjection(LambdaProjection.Property<Fund>(f => f.Id)); 
} 

protected DetachedCriteria GetAvailableCompanyIdsPerDataUniverse() 
{ 
    return GetAvailableIdsPerDataUniverse() 
     .SetProjection(LambdaProjection.Property<Fund>(f => f.Company.Id)); 
} 

protected DetachedCriteria GetAvailableCategoryIdsPerDataUniverse() 
{ 
    return GetAvailableIdsPerDataUniverse() 
     .SetProjection(LambdaProjection.Property<Fund>(f => f.Category.Id)); 
} 

GetAvailableIdsPerDataUniverse() est défini comme:

protected DetachedCriteria GetAvailableIdsPerDataUniverse() 
{ 
    return DetachedCriteria.For<Fund>() 
     .SetFetchMode<Fund>(f => f.ShareClasses, FetchMode.Join) 
     .CreateCriteria<Fund>(f => f.ShareClasses) 
     .Add(LambdaSubquery.Property<ShareClass>(x => x.Id).In(GetAvailableShareClassIdsPerDataUniverse())) 
     .Add<ShareClass>(f => f.ExcludeFromFT == false); 
} 

Pour chaque méthode, la seule différence est l'expression qui est utilisée pour sélectionner les données, à savoir

f => f.Id, f => f.Company.Id et f => f.Category.Id

Est-ce que quelqu'un pourrait me dire s'il est possible de passer ces différences en GetAvailableIdsPerDataUniverse() en tant que variable, donc je ne peux avoir qu'une seule méthode au lieu d'en avoir 4?

Répondre

4

tapant directement dans le navigateur, donc ne peut pas contenir des erreurs

protected DetachedCriteria GetAvailableIdsPerDataUniverse(Expression<Fund, int> e) 
{ 
    return DetachedCriteria.For<Fund>() 
     .SetFetchMode<Fund>(f => f.ShareClasses, FetchMode.Join) 
     .CreateCriteria<Fund>(f => f.ShareClasses) 
     .Add(LambdaSubquery.Property<ShareClass>(x => x.Id).In(GetAvailableShareClassIdsPerDataUniverse())) 
     .Add<ShareClass>(f => f.ExcludeFromFT == false). 
     .SetProjection(LambdaProjection.Property<Fund>(e)); 
} 

GetAvailableIdsPerDataUniverse(e => e.Category.Id) 
//... 

Modifier J'ai vérifié la documentation de NHibernate.LambdaExtensions, le type de LambdaProjection.Property est-

public static PropertyProjection Property<T>(Expression<Func<T, object>> expression) 

Donc paramètre le type doit être

System.Linq.Expressions.Expression<Func<Fund, object>> 
+0

Merci @desco, mais cela donne l'erreur 'Le type non générique 'NHibernate.Criterion.Expression' ne peut pas être utilisé avec des arguments de type'. Avez-vous déjà vu ça? Savez-vous comment je peux résoudre cela? – DaveDev

+0

Utilisez le nom complet du type (System.Linq.Expressions.Expression > e) – desco

+0

Merci desco, j'ai effectivement figuré le 'object' au lieu de' int' moi-même il ya quelques minutes et tout fonctionne parfaitement. Je n'aurais jamais été aussi loin sans votre aide. Cela va m'aider à réduire la quantité de code dont j'ai besoin pour écrire de façon exponentielle! – DaveDev

Questions connexes