36 lines
1.1 KiB
C#
36 lines
1.1 KiB
C#
using System.Linq.Expressions;
|
|
|
|
namespace ApplicationHub.Domain.Contracts.Linq;
|
|
|
|
public class EntityExpressionConverter<TModel, TEntity> : ExpressionVisitor
|
|
{
|
|
private readonly ParameterExpression _entityParameter;
|
|
private readonly ParameterExpression _modelParameter;
|
|
|
|
public EntityExpressionConverter(ParameterExpression modelParameter)
|
|
{
|
|
_modelParameter = modelParameter;
|
|
_entityParameter = Expression.Parameter(typeof(TEntity), "entity");
|
|
}
|
|
|
|
public Expression<Func<TEntity, bool>> Convert(Expression<Func<TModel, bool>> expression)
|
|
{
|
|
var body = Visit(expression.Body);
|
|
return Expression.Lambda<Func<TEntity, bool>>(body, _entityParameter);
|
|
}
|
|
|
|
protected override Expression VisitParameter(ParameterExpression node)
|
|
{
|
|
return node == _modelParameter ? _entityParameter : base.VisitParameter(node);
|
|
}
|
|
|
|
protected override Expression VisitMember(MemberExpression node)
|
|
{
|
|
if (node.Expression == _modelParameter)
|
|
{
|
|
return Expression.Property(_entityParameter, node.Member.Name);
|
|
}
|
|
|
|
return base.VisitMember(node);
|
|
}
|
|
} |