コード例 #1
0
        protected override Expression VisitMemberAccess(MemberExpression m)
        {
            Expression       source = this.Visit(m.Expression);
            EntityExpression ex     = source as EntityExpression;

            if (ex != null /* && this.mapping.IsRelationship(ex.Entity, m.Member) */)
            {
                ProjectionExpression projection = (ProjectionExpression)this.Visit(this.mapper.GetMemberExpression(source, ex.Entity, m.Member));
                if (this.currentFrom != null /* && this.mapping.IsSingletonRelationship(ex.Entity, m.Member) */)
                {
                    // convert singleton associations directly to OUTER APPLY
                    projection = this.language.AddOuterJoinTest(projection);
                    Expression newFrom = new JoinExpression(JoinType.OuterApply, this.currentFrom, projection.Select, null);
                    this.currentFrom = newFrom;
                    return(projection.Projector);
                }
                return(projection);
            }
            else
            {
                Expression       result = QueryBinder.BindMember(source, m.Member);
                MemberExpression mex    = result as MemberExpression;
                if (mex != null && mex.Member == m.Member && mex.Expression == m.Expression)
                {
                    return(m);
                }
                return(result);
            }
        }
コード例 #2
0
        /// <summary>
        /// Makes the predicate.
        /// </summary>
        /// <param name="e1">The e1.</param>
        /// <param name="e2">The e2.</param>
        /// <param name="members">The members.</param>
        /// <param name="negate">if set to <c>true</c> [negate].</param>
        /// <returns></returns>
        protected Expression MakePredicate(Expression e1, Expression e2, IEnumerable <MemberInfo> members, bool negate)
        {
            var pred = members.Select(m => QueryBinder.BindMember(e1, m).Equal(QueryBinder.BindMember(e2, m))).Join(ExpressionType.And);

            if (negate)
            {
                pred = Expression.Not(pred);
            }
            return(pred);
        }