using System.Collections.Generic;
using System.Linq.Expressions;
namespace ExpressionVisitorTests
public static void Main()
var colourRepository = new ColourRepository();
var result = colourRepository.GetWhere(c => c.Name == "Red");
Console.WriteLine(result.Count());
public DtoColour(string name)
public string Name { get; set; }
public class DomainColour {
public DomainColour(string name)
public string Name { get; set; }
public class ColourRepository {
private IList<DtoColour> Colours { get; set; }
public ColourRepository()
Colours = new List<DtoColour>()
public IEnumerable<DomainColour> GetWhere(Expression<Func<DomainColour, bool>> predicate)
var coonvertedPred = MyExpressionVisitor.Convert(predicate);
return Colours.Where(coonvertedPred).Select(c => new DomainColour(c.Name)).ToList();
public class MyExpressionVisitor : ExpressionVisitor
public static Func<DtoColour, bool> Convert<T>(Expression<T> root)
var visitor = new MyExpressionVisitor();
var expression = (Expression<Func<DtoColour, bool>>)visitor.Visit(root);
return expression.Compile();
protected override Expression VisitParameter(ParameterExpression node)
return Expression.Parameter(typeof(DtoColour), node.Name);
protected override Expression VisitMember(MemberExpression node)
if (node.Expression.Type == typeof(DomainColour))
var type = typeof(DtoColour);
var param = Expression.Parameter(type, "colour");
var member = Expression.MakeMemberAccess(param, type.GetProperty(node.Member.Name));
return base.VisitMember(node);