6
私は自分のドメインでPOCOSを使用しているので、自分のリポジトリが自分のPOCOS型の式フィルタを受け取り、式のパラメータを自分のLINQテーブルの型に変更できるようにしたい私のメンバーとして私は1と2のラムダ条件をメンバと定数に分割することでこれを達成できました。条件を追加すると、バイナリ式を再帰的に解析します。式のパラメータの種類を変更する方法は?
(これは、私が終わった方法です
var q = from p in
db.products.Where(ExpressionBuilder.Create<MyPocoProduct,LinqProduct>(myPocoProductExpression))
私は
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;
}
}