如何像变量一样将表达式传递给方法?

发布于 2024-09-12 07:09:13 字数 1401 浏览 4 评论 0原文

我有 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.Idf => f.Company.Idf => f.Category.Id

有人可以告诉我是否可以将这些差异作为变量传递到 GetAvailableIdsPerDataUniverse() 中,这样我就只能有 1 个方法而不是 4 个方法?

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 GetAvailableIdsPerDataUniverse() is 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's used to select the data, i.e.

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

Could somebody please tell me if it's possible to pass that those differences into GetAvailableIdsPerDataUniverse() as a variable so I can have only 1 method instead of having 4?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浴红衣 2024-09-19 07:09:13

直接在浏览器中输入,因此可能不会包含错误

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>>

typing directly in browser, so may not 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've checked documentation of NHibernate.LambdaExtensions, type of LambdaProjection.Property is

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

So parameter type should be

System.Linq.Expressions.Expression<Func<Fund, object>>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文