private static Expression BuildWhereExpression(Expression parameter, ConditionType conditionType, dynamic[] values, params string[] properties) { Type childType = null; if (properties.Count() > 1) { //build path parameter = Expression.Property(parameter, properties[0]); var isCollection = parameter.Type.GetInterfaces().Any(x => x.Name == "IEnumerable"); //if it´s a collection we later need to use the predicate in the methodexpressioncall Expression childParameter; if (isCollection) { childType = parameter.Type.GetGenericArguments()[0]; childParameter = Expression.Parameter(childType, childType.Name); } else { childParameter = parameter; } //skip current property and get navigation property expression recursivly var innerProperties = properties.Skip(1).ToArray(); Expression predicate = BuildWhereExpression(childParameter, conditionType, values, innerProperties); if (isCollection) { //build subquery predicate = BuildWhereSubQueryExpression(parameter, childParameter, childType, predicate); } return(predicate); } //build final predicate var childProperty = parameter.Type.GetProperty(properties[0]); MemberExpression memberExpression = Expression.Property(parameter, childProperty); Expression orExpression = null; foreach (var d in values) { var tt = ConvertHelper.Convert(d, childProperty.PropertyType); ConstantExpression val = Expression.Constant(tt, childProperty.PropertyType); Expression newExpression = conditionType.ToBinaryExpression(memberExpression, val); //MakeLambda(parameter, conditionType.ToBinaryExpression(memberExpression, val)); if (orExpression == null) { orExpression = newExpression; } else { orExpression = Expression.OrElse(orExpression, newExpression); } } return(orExpression); }