@@ -27,78 +27,18 @@ public static MemberInfo DecodeMemberAccessExpression<TEntity, TResult>(Expressi
27
27
return ( ( MemberExpression ) expression . Body ) . Member ;
28
28
}
29
29
30
- internal static string TryGetEntityName ( ISessionFactoryImplementor sessionFactory , Expression expression ,
31
- out string memberPath , out IType memberType )
30
+ internal static string TryGetEntityName (
31
+ ISessionFactoryImplementor sessionFactory ,
32
+ Expression expression ,
33
+ out string memberPath ,
34
+ out IType memberType )
32
35
{
33
- string entityName = null ;
34
- var memberPaths = new Stack < MemberMetadata > ( ) ;
35
- var currentExpression = expression ;
36
- System . Type convertType = null ;
37
- bool hasIndexer = false ;
38
- while ( true )
36
+ var memberPaths = TryGetAllMemberMetadata ( sessionFactory , expression , out var entityName , out var convertType ) ;
37
+ if ( memberPaths == null )
39
38
{
40
- if ( currentExpression is MemberExpression subMemberExpression )
41
- {
42
- memberPaths . Push ( new MemberMetadata ( subMemberExpression . Member . Name , convertType , hasIndexer ) ) ;
43
- convertType = null ;
44
- hasIndexer = false ;
45
- currentExpression = subMemberExpression . Expression ;
46
- }
47
- else if ( currentExpression is QuerySourceReferenceExpression querySourceReferenceExpression )
48
- {
49
- if ( querySourceReferenceExpression . ReferencedQuerySource is IFromClause fromClause )
50
- {
51
- currentExpression = fromClause . FromExpression ;
52
- }
53
- else if ( querySourceReferenceExpression . ReferencedQuerySource is JoinClause joinClause )
54
- {
55
- currentExpression = joinClause . InnerSequence ;
56
- }
57
- else
58
- {
59
- // Unknown ReferencedQuerySource
60
- memberPath = null ;
61
- memberType = null ;
62
- return null ;
63
- }
64
- }
65
- else if ( currentExpression is UnaryExpression unaryExpression ) // ((BaseEntity)q.Entity).Prop
66
- {
67
- currentExpression = unaryExpression . Operand ;
68
- convertType = unaryExpression . Type ;
69
- }
70
- else if ( currentExpression is NhNominatedExpression nominatedExpression ) // ((BaseEntity)q.Entity).Prop
71
- {
72
- currentExpression = nominatedExpression . Expression ;
73
- }
74
- else if ( currentExpression is ConstantExpression constantExpression )
75
- {
76
- if ( ! ( constantExpression . Value is IEntityNameProvider entityNameProvider ) )
77
- {
78
- // Not a NhQueryable<T>
79
- memberPath = null ;
80
- memberType = null ;
81
- return null ;
82
- }
83
-
84
- entityName = entityNameProvider . EntityName ;
85
- break ;
86
- }
87
- else if ( currentExpression is MethodCallExpression methodCallExpression &&
88
- ListIndexerGenerator . IsMethodSupported ( methodCallExpression . Method ) )
89
- {
90
- currentExpression = methodCallExpression . Object == null
91
- ? Enumerable . First ( methodCallExpression . Arguments ) // q.Children.ElementAt(0)
92
- : methodCallExpression . Object ; // q.Children[0]
93
- hasIndexer = true ;
94
- }
95
- else
96
- {
97
- // Not supported expressions
98
- memberPath = null ;
99
- memberType = null ;
100
- return null ;
101
- }
39
+ memberPath = null ;
40
+ memberType = null ;
41
+ return null ;
102
42
}
103
43
104
44
entityName = GetEntityName ( entityName , convertType , sessionFactory , out var persister ) ;
@@ -213,10 +153,87 @@ internal static string TryGetEntityName(ISessionFactoryImplementor sessionFactor
213
153
}
214
154
}
215
155
216
- private static string GetEntityName ( string currentEntityName ,
217
- System . Type convertedType ,
218
- ISessionFactoryImplementor sessionFactory ,
219
- out IEntityPersister persister )
156
+ private static Stack < MemberMetadata > TryGetAllMemberMetadata (
157
+ ISessionFactoryImplementor sessionFactory ,
158
+ Expression expression ,
159
+ out string entityName ,
160
+ out System . Type convertType )
161
+ {
162
+ var memberPaths = new Stack < MemberMetadata > ( ) ;
163
+ var currentExpression = expression ;
164
+ convertType = null ;
165
+ bool hasIndexer = false ;
166
+ while ( true )
167
+ {
168
+ if ( currentExpression is MemberExpression subMemberExpression )
169
+ {
170
+ memberPaths . Push ( new MemberMetadata ( subMemberExpression . Member . Name , convertType , hasIndexer ) ) ;
171
+ convertType = null ;
172
+ hasIndexer = false ;
173
+ currentExpression = subMemberExpression . Expression ;
174
+ }
175
+ else if ( currentExpression is QuerySourceReferenceExpression querySourceReferenceExpression )
176
+ {
177
+ if ( querySourceReferenceExpression . ReferencedQuerySource is IFromClause fromClause )
178
+ {
179
+ currentExpression = fromClause . FromExpression ;
180
+ }
181
+ else if ( querySourceReferenceExpression . ReferencedQuerySource is JoinClause joinClause )
182
+ {
183
+ currentExpression = joinClause . InnerSequence ;
184
+ }
185
+ else
186
+ {
187
+ // Unknown ReferencedQuerySource
188
+ entityName = null ;
189
+ return null ;
190
+ }
191
+ }
192
+ else if ( currentExpression is UnaryExpression unaryExpression ) // ((BaseEntity)q.Entity).Prop
193
+ {
194
+ currentExpression = unaryExpression . Operand ;
195
+ convertType = unaryExpression . Type ;
196
+ }
197
+ else if ( currentExpression is NhNominatedExpression nominatedExpression ) // ((BaseEntity)q.Entity).Prop
198
+ {
199
+ currentExpression = nominatedExpression . Expression ;
200
+ }
201
+ else if ( currentExpression is ConstantExpression constantExpression )
202
+ {
203
+ if ( ! ( constantExpression . Value is IEntityNameProvider entityNameProvider ) )
204
+ {
205
+ // Not a NhQueryable<T>
206
+ entityName = null ;
207
+ return null ;
208
+ }
209
+
210
+ entityName = entityNameProvider . EntityName ;
211
+ break ;
212
+ }
213
+ else if ( currentExpression is MethodCallExpression methodCallExpression &&
214
+ ListIndexerGenerator . IsMethodSupported ( methodCallExpression . Method ) )
215
+ {
216
+ currentExpression = methodCallExpression . Object == null
217
+ ? Enumerable . First ( methodCallExpression . Arguments ) // q.Children.ElementAt(0)
218
+ : methodCallExpression . Object ; // q.Children[0]
219
+ hasIndexer = true ;
220
+ }
221
+ else
222
+ {
223
+ // Not supported expressions
224
+ entityName = null ;
225
+ return null ;
226
+ }
227
+ }
228
+
229
+ return memberPaths ;
230
+ }
231
+
232
+ private static string GetEntityName (
233
+ string currentEntityName ,
234
+ System . Type convertedType ,
235
+ ISessionFactoryImplementor sessionFactory ,
236
+ out IEntityPersister persister )
220
237
{
221
238
persister = sessionFactory . TryGetEntityPersister ( currentEntityName ) ;
222
239
if ( persister == null )
@@ -244,9 +261,10 @@ private static string GetEntityName(string currentEntityName,
244
261
return GetEntityName ( convertedType , sessionFactory , out persister ) ;
245
262
}
246
263
247
- private static string GetEntityName ( System . Type convertedType ,
248
- ISessionFactoryImplementor sessionFactory ,
249
- out IEntityPersister persister )
264
+ private static string GetEntityName (
265
+ System . Type convertedType ,
266
+ ISessionFactoryImplementor sessionFactory ,
267
+ out IEntityPersister persister )
250
268
{
251
269
if ( convertedType == null )
252
270
{
0 commit comments