예제 #1
0
        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);
        }