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); } }
/// <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); }