private static Expression <Func <JEntity, bool> > CreateWherePredicate <QEntity, QKey, JEntity>(ParameterExpression queryParameter, Expression <Func <QEntity, QKey> > queryKey, string joinPropertyName) { var queryPropertyInfo = ((PropertyInfo)((MemberExpression)queryKey.Body).Member); var innerjoinCollectionParameter = Expression.Parameter(typeof(JEntity), "join"); var innerRightProperty = Expression.Property(innerjoinCollectionParameter, joinPropertyName); //Street Expression bodyProperty = queryParameter; MemberExpression tempProperty = (MemberExpression)queryKey.Body; var listMemberNames = new List <string>(); while (tempProperty != null) { listMemberNames.Add(tempProperty.Member.Name); tempProperty = tempProperty.Expression as MemberExpression; } foreach (var name in listMemberNames.AsEnumerable().Reverse()) { bodyProperty = Expression.Property(bodyProperty, name); } Expression <Func <JEntity, bool> > wherePredicate = //j => i.Id == j.Id Expression.Lambda <Func <JEntity, bool> >( Expression.Equal(bodyProperty, UnaryExpression.Convert(innerRightProperty, queryPropertyInfo.PropertyType)), new[] { innerjoinCollectionParameter } //j => ); return(wherePredicate); }