我正在构建一个程序,用户可以通过选择要包含在报告中的字段和搜索条件来构建报告。然后使用这些字段/条件形成查询并从我的数据库中提取相关数据。
有许多不同的字段和搜索条件,可以添加更多。我从未使用过表达式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 });
}
我的问题是,我怎么能做类似的事情来加入两个(或更多)表?我一直在谷歌搜索,无法找到任何如何做到这一点的例子。