代码之家  ›  专栏  ›  技术社区  ›  DaveDev

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

  •  3
  • DaveDev  · 技术社区  · 14 年前

    我有三种几乎完全相同的方法:

    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 回复  |  直到 14 年前
        1
  •  4
  •   desco    14 年前

    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的类型。属性是

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

    所以参数类型应该是

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