ApplicationHub/ApplicationHub.Domain.Contracts/Linq/EntityExpressionConverter.cs
2025-08-09 15:03:12 +02:00

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);
}
}