How do I pass an expression to a method like a variable?

I have 3 methods that are almost exactly identical:

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));
}

where is GetAvailableIdsPerDataUniverse()defined as:

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);
}

For each method, the only difference is the expression that is used to select data, i.e.

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

Can someone please tell me if these differences can be passed GetAvailableIdsPerDataUniverse()as a variable, so I can only have 1 method instead of 4?

+3
source share
1 answer

input directly in the browser, so it cannot contain errors

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)
//...

Edit I checked the documentation of NHibernate.LambdaExtensions, type LambdaProjection.Property

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

Thus, the type of the parameter must be

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

Source: https://habr.com/ru/post/1757324/


All Articles