vì tôi đang sử dụng POCOS trong miền của mình, tôi muốn kho lưu trữ của mình có thể nhận bộ lọc biểu thức loại POCOS của tôi và thay đổi tham số trong biểu thức thành loại bảng LINQ của tôi, các trường của tôi có cùng tên như các thành viên của tôi vì vậy tôi đã có thể thực hiện điều này cho 1 và 2 điều kiện lambda bằng cách đột nhập vào các thành viên và hằng số, nếu tôi thêm nhiều điều kiện này dẫn đến phân tích đệ quy biểu thức nhị phân.cách thay đổi loại tham số trong Biểu thức?
đây là làm thế nào tôi đã kết thúc, có một cách dễ dàng để thực hiện điều này
var q = from p in
db.products.Where(ExpressionBuilder.Create<MyPocoProduct,LinqProduct>(myPocoProductExpression))
cách tôi thay đổi nó
public class ExpressionBuilder
{
public static Expression<Func<TLinq, bool>> Create<TEntity, TLinq>(Expression<Func<TEntity, bool>> predicate)
{
try
{
//get the predicate body
var binaryExpr = (BinaryExpression)predicate.Body;
//holds the resuting Expression
var expressionResult = default(BinaryExpression);
// Create the parameter of the Linq table Type
ParameterExpression parameter = Expression.Parameter(typeof(TLinq), predicate.Parameters[0].Name);
//if only one condition was passed
if (binaryExpr.Left is MemberExpression)
{
expressionResult = CreateExpression(binaryExpr, parameter,binaryExpr.NodeType);
}
else if (binaryExpr.Left is BinaryExpression)
{
var predicatesList = new List<BinaryExpression>();
var leftExp = CreateExpression((BinaryExpression)binaryExpr.Left, parameter, binaryExpr.Left.NodeType);
var RightExp = CreateExpression((BinaryExpression)binaryExpr.Right, parameter, binaryExpr.Right.NodeType);
expressionResult = Expression.And(leftExp, RightExp);
}
return Expression.Lambda<Func<TLinq, bool>>(expressionResult, parameter);
}
catch (Exception ex)
{
throw new Exception("Eror While creating Filter", ex);
}
}
private static BinaryExpression CreateExpression(BinaryExpression expression, ParameterExpression parameter,ExpressionType expType)
{
var memberExp = expression.Left as MemberExpression;
if (memberExp == null) throw new ArgumentException("left expression is not a member Expression");
//create the Member expression
MemberExpression member = LambdaExpression.PropertyOrField(parameter, memberExp.Member.Name);
//create the constant against the value
ConstantExpression constant = Expression.Constant(((ConstantExpression)expression.Right).Value);
return CreateExpressionOfType(expType, member, constant);
}
private static BinaryExpression CreateExpressionOfType(ExpressionType expType, MemberExpression member, ConstantExpression constant)
{
//creates the body fo the lambda
var resultExpression = default(BinaryExpression);
switch (expType)
{
case ExpressionType.And:
break;
case ExpressionType.AndAlso:
break;
case ExpressionType.ConvertChecked:
break;
case ExpressionType.Equal:
resultExpression = Expression.Equal(member, constant);
break;
case ExpressionType.ExclusiveOr:
break;
case ExpressionType.GreaterThan:
resultExpression = Expression.GreaterThan(member, constant);
break;
case ExpressionType.GreaterThanOrEqual:
break;
case ExpressionType.LessThan:
resultExpression = Expression.LessThan(member, constant);
break;
case ExpressionType.LessThanOrEqual:
break;
case ExpressionType.Not:
break;
case ExpressionType.NotEqual:
break;
default:
break;
}
return resultExpression;
}
}