49 protected static
Expression<Func<TInput, TOutput>> BuildSubProjection<TSubInput, TSubOutput, TTransformer>(
50 Expression<Func<TInput, TSubOutput?, TOutput>> transformerExpression,
51 Expression<Func<TInput, TSubInput?>> subInputSelectionExpression)
52 where TSubOutput : class
53 where TTransformer :
ITransformer<TSubInput, TSubOutput>, new()
55 var subTransformer =
new TTransformer();
57 var primaryInput = global::System.Linq.Expressions.Expression.Parameter(typeof(TInput),
"input");
58 var subInputExpression = global::System.Linq.Expressions.Expression.Invoke(subInputSelectionExpression, primaryInput);
60 var notNullExpression = global::System.Linq.Expressions.Expression.MakeBinary(
61 ExpressionType.NotEqual,
63 global::System.Linq.Expressions.Expression.Constant(
null, typeof(TSubInput)));
65 var subOutputExpression = global::System.Linq.Expressions.Expression.Invoke(subTransformer.Expression, subInputExpression);
67 var conditionalSubOutputExpression = global::System.Linq.Expressions.Expression.Condition(
70 global::System.Linq.Expressions.Expression.Constant(
null, typeof(TSubOutput)));
72 var outputExpression = global::System.Linq.Expressions.Expression.Invoke(transformerExpression, primaryInput, conditionalSubOutputExpression);
74 return global::System.Linq.Expressions.Expression.Lambda<Func<TInput, TOutput>>(outputExpression, primaryInput);
90 protected static Expression<Func<TInput, TOutput>> BuildSubProjection<
97 Expression<Func<TInput, TSubOutput1?, TSubOutput2?, TOutput>> transformerExpression,
98 Expression<Func<TInput, TSubInput1?>> subInput1SelectionExpression,
99 Expression<Func<TInput, TSubInput2?>> subInput2SelectionExpression)
100 where TSubOutput1 : class
101 where TSubOutput2 : class
102 where TTransformer1 :
ITransformer<TSubInput1, TSubOutput1>, new()
103 where TTransformer2 :
ITransformer<TSubInput2, TSubOutput2>, new()
105 var subTransformer1 =
new TTransformer1();
106 var subTransformer2 =
new TTransformer2();
108 var primaryInput = global::System.Linq.Expressions.Expression.Parameter(typeof(TInput),
"input");
110 var subInput1Expression = global::System.Linq.Expressions.Expression.Invoke(subInput1SelectionExpression, primaryInput);
111 var subInput2Expression = global::System.Linq.Expressions.Expression.Invoke(subInput2SelectionExpression, primaryInput);
113 var notNullExpression1 = global::System.Linq.Expressions.Expression.MakeBinary(
114 ExpressionType.NotEqual,
116 global::System.Linq.Expressions.Expression.Constant(
null, typeof(TSubInput1)));
117 var notNullExpression2 = global::System.Linq.Expressions.Expression.MakeBinary(
118 ExpressionType.NotEqual,
120 global::System.Linq.Expressions.Expression.Constant(
null, typeof(TSubInput2)));
122 var subOutput1Expression = global::System.Linq.Expressions.Expression.Invoke(subTransformer1.Expression, subInput1Expression);
123 var subOutput2Expression = global::System.Linq.Expressions.Expression.Invoke(subTransformer2.Expression, subInput2Expression);
125 var conditionalSubOutput1Expression = global::System.Linq.Expressions.Expression.Condition(
127 subOutput1Expression,
128 global::System.Linq.Expressions.Expression.Constant(
null, typeof(TSubOutput1)));
130 var conditionalSubOutput2Expression = global::System.Linq.Expressions.Expression.Condition(
132 subOutput2Expression,
133 global::System.Linq.Expressions.Expression.Constant(
null, typeof(TSubOutput2)));
135 var outputExpression = global::System.Linq.Expressions.Expression.Invoke(transformerExpression, primaryInput, conditionalSubOutput1Expression, conditionalSubOutput2Expression);
137 return global::System.Linq.Expressions.Expression.Lambda<Func<TInput, TOutput>>(outputExpression, primaryInput);