|
1 | 1 | using System.Linq;
|
| 2 | +using System.Linq.Expressions; |
2 | 3 | using NHibernate.Linq.Visitors;
|
3 | 4 | using Remotion.Linq;
|
4 | 5 | using Remotion.Linq.Clauses;
|
@@ -42,6 +43,31 @@ private static void FlattenSubQuery(SubQueryExpression subQueryExpression, Query
|
42 | 43 | var visitor1 = new PagingRewriterSelectClauseVisitor(queryModel.MainFromClause);
|
43 | 44 | queryModel.SelectClause.TransformExpressions(visitor1.Swap);
|
44 | 45 | }
|
| 46 | + else if (queryModel.ResultOperators.Count == 1 && queryModel.ResultOperators[0] is AnyResultOperator && |
| 47 | + queryModel.BodyClauses.Count == 1 && queryModel.BodyClauses[0] is WhereClause whereClause && |
| 48 | + whereClause.Predicate is BinaryExpression whereClausePredicate && |
| 49 | + new[] {whereClausePredicate.Left, whereClausePredicate.Right}.Count(x => x.NodeType == ExpressionType.MemberAccess) == 1) |
| 50 | + { |
| 51 | + var joinOnBodyClause = whereClausePredicate.Right.NodeType == ExpressionType.MemberAccess |
| 52 | + ? whereClausePredicate.Right |
| 53 | + : whereClausePredicate.Left; |
| 54 | + var cro = new ContainsResultOperator(joinOnBodyClause); |
| 55 | + |
| 56 | + queryModel.BodyClauses.Clear(); |
| 57 | + foreach (var orderByClause in subQueryModel.BodyClauses) |
| 58 | + { |
| 59 | + queryModel.BodyClauses.Add(orderByClause); |
| 60 | + } |
| 61 | + |
| 62 | + queryModel.ResultOperators.Clear(); |
| 63 | + foreach (var resultOperator in subQueryModel.ResultOperators) |
| 64 | + { |
| 65 | + queryModel.ResultOperators.Add(resultOperator); |
| 66 | + } |
| 67 | + |
| 68 | + queryModel.ResultOperators.Add(cro); |
| 69 | + queryModel.ResultTypeOverride = typeof(bool); |
| 70 | + } |
45 | 71 | else
|
46 | 72 | {
|
47 | 73 | var cro = new ContainsResultOperator(new QuerySourceReferenceExpression(subQueryMainFromClause));
|
|
0 commit comments