88using System . Collections . Generic ;
99using System . Linq ;
1010using Xtensive . Core ;
11- using Xtensive . Collections ;
1211using Tuple = Xtensive . Tuples . Tuple ;
1312using Xtensive . Sql ;
1413using Xtensive . Sql . Dml ;
15- using Xtensive . Orm . Rse ;
1614using Xtensive . Orm . Rse . Providers ;
1715
1816namespace Xtensive . Orm . Providers
@@ -32,25 +30,29 @@ protected override SqlProvider VisitInclude(IncludeProvider provider)
3230 TemporaryTableDescriptor tableDescriptor = null ;
3331 QueryParameterBinding extraBinding = null ;
3432 var algorithm = provider . Algorithm ;
35- if ( ! temporaryTablesSupported )
33+ if ( ! temporaryTablesSupported ) {
3634 algorithm = IncludeAlgorithm . ComplexCondition ;
35+ }
36+
3737 switch ( algorithm ) {
3838 case IncludeAlgorithm . Auto :
39- var complexConditionExpression = CreateIncludeViaComplexConditionExpression (
40- provider , BuildRowFilterParameterAccessor ( filterDataSource , true ) ,
41- sourceColumns , out extraBinding ) ;
4239 var temporaryTableExpression = CreateIncludeViaTemporaryTableExpression (
4340 provider , sourceColumns , out tableDescriptor ) ;
41+ var complexConditionExpression = CreateIncludeViaComplexConditionExpression (
42+ provider , BuildAutoRowFilterParameterAccessor ( tableDescriptor ) ,
43+ sourceColumns , out extraBinding ) ;
4444 resultExpression = SqlDml . Variant ( extraBinding ,
4545 complexConditionExpression , temporaryTableExpression ) ;
4646 anyTemporaryTablesRequired = true ;
4747 break ;
4848 case IncludeAlgorithm . ComplexCondition :
4949 resultExpression = CreateIncludeViaComplexConditionExpression (
50- provider , BuildRowFilterParameterAccessor ( filterDataSource , false ) ,
50+ provider , BuildComplexConditionRowFilterParameterAccessor ( filterDataSource ) ,
5151 sourceColumns , out extraBinding ) ;
52- if ( ! anyTemporaryTablesRequired )
52+ if ( ! anyTemporaryTablesRequired ) {
5353 requestOptions |= QueryRequestOptions . AllowOptimization ;
54+ }
55+
5456 break ;
5557 case IncludeAlgorithm . TemporaryTable :
5658 resultExpression = CreateIncludeViaTemporaryTableExpression (
@@ -63,8 +65,10 @@ protected override SqlProvider VisitInclude(IncludeProvider provider)
6365 resultExpression = GetBooleanColumnExpression ( resultExpression ) ;
6466 var calculatedColumn = provider . Header . Columns [ provider . Header . Length - 1 ] ;
6567 AddInlinableColumn ( provider , calculatedColumn , resultQuery , resultExpression ) ;
66- if ( extraBinding != null )
67- bindings = bindings . Concat ( EnumerableUtils . One ( extraBinding ) ) ;
68+ if ( extraBinding != null ) {
69+ bindings = bindings . Append ( extraBinding ) ;
70+ }
71+
6872 var request = CreateQueryRequest ( Driver , resultQuery , bindings , provider . Header . TupleDescriptor , requestOptions ) ;
6973 return new SqlIncludeProvider ( Handlers , request , tableDescriptor , filterDataSource , provider , source ) ;
7074 }
@@ -97,16 +101,15 @@ protected SqlExpression CreateIncludeViaTemporaryTableExpression(
97101 return resultExpression ;
98102 }
99103
100- protected static Func < ParameterContext , object > BuildRowFilterParameterAccessor (
101- Func < ParameterContext , IEnumerable < Tuple > > filterDataSource , bool takeFromContext )
102- {
103- if ( ! takeFromContext ) {
104- return context => filterDataSource . Invoke ( context ) . ToList ( ) ;
105- }
104+ private static Func < ParameterContext , object > BuildComplexConditionRowFilterParameterAccessor (
105+ Func < ParameterContext , IEnumerable < Tuple > > filterDataSource ) =>
106+ context => filterDataSource . Invoke ( context ) . ToList ( ) ;
106107
107- return context => context . TryGetValue ( SqlIncludeProvider . rowFilterParameter , out var filterData )
108- ? filterData
109- : null ;
110- }
108+ private static Func < ParameterContext , object > BuildAutoRowFilterParameterAccessor (
109+ TemporaryTableDescriptor tableDescriptor ) =>
110+ context =>
111+ context . TryGetValue ( SqlIncludeProvider . CreateFilterParameter ( tableDescriptor ) , out var filterData )
112+ ? filterData
113+ : null ;
111114 }
112115}
0 commit comments