c#表达式树 - 动态连接表

时间:2015-06-15 18:58:24

标签: c# .net expression-trees

我正在构建一个程序,用户可以通过选择要包含在报告中的字段和搜索条件来构建报告。然后使用这些字段/条件形成查询并从我的数据库中提取相关数据。

有许多不同的字段和搜索条件,可以添加更多。我从未使用过表达式tress,但一直在阅读它们,并认为这将是一个使用它们的好地方,所以我可以动态构建一个查询来获取我需要的数据。

现在,我有两种方法。在GetPredicateEqual中,我可以传入一个包含列名和值的表,然后返回表达式以获得正确的结果。 GetSelector类似,但它返回一个表达式,用于从结果中选择某个列。

这是我的代码:

        public static void BuildThePredicate()
    {
        var equals = ExpressionType.Equal;
        using (DataContext dc = new DataContext)
        {                                
            Expression<Func<ProductContent, bool>> predicate = GetPredicateEqual<ProductContent>("ContentId", (Int32)1, equals);

            Expression<Func<ProductContent, string>> selector = GetSelector<ProductContent, string>("ProductTitle");

            var query = dc.ProductContent.Where(predicate);
            var query2 = dc.ProdutContent.Where(predicate).Select(GetSelector<ProductContent, string>("ProductTitle"));
        }
    }

    public static Expression<Func<TEntity, bool>> GetPredicateEqual<TEntity>(string fieldName, long id, ExpressionType op)
    {
        PropertyInfo pi = typeof(TEntity).GetProperty(fieldName);
        ParameterExpression lhsParam = Expression.Parameter(typeof(TEntity), "x");

        Expression lhs = Expression.Property(lhsParam, pi);
        Expression rhs = Expression.Constant(Convert.ChangeType(id, pi.PropertyType));

        var binary = Expression.MakeBinary(op, lhs, rhs);
        var lambda = Expression.Lambda<Func<TEntity, bool>>(binary, lhsParam);

        return lambda;
    }

    public static Expression<Func<T, TReturn>> GetSelector<T, TReturn>(string fieldName)        
    {            
        ParameterExpression p = Expression.Parameter(typeof(T), "x");
        var body = Expression.Property(p, fieldName);
        return Expression.Lambda<Func<T, TReturn>>(body, new ParameterExpression[] { p });
    }

我的问题是,我怎么能做类似的事情来加入两个(或更多)表?我一直在谷歌搜索,无法找到任何如何做到这一点的例子。

0 个答案:

没有答案