Как передать выражение в метод, подобный переменной? - PullRequest
3 голосов
/ 30 июля 2010

У меня есть 3 метода, которые почти полностью идентичны:

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() определяется как:

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

Для каждого метода единственное отличие - это выражение, котороеиспользуется для выбора данных, т.е.

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

Может кто-нибудь подсказать, возможно ли передать эти различия в GetAvailableIdsPerDataUniverse() в качестве переменнойпоэтому я могу иметь только 1 метод вместо 4?

1 Ответ

4 голосов
/ 30 июля 2010

вводится напрямую в браузере, поэтому может не содержать ошибок

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

Редактировать Я проверил документацию по NHibernate.LambdaExtensions, тип LambdaProjection.Property

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

Таким образом, тип параметра должен быть

System.Linq.Expressions.Expression<Func<Fund, object>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...