|
19 | 19 | using System.Collections.ObjectModel;
|
20 | 20 | using System.Linq;
|
21 | 21 | using System.Linq.Expressions;
|
| 22 | +using System.Reflection; |
22 | 23 | using System.Text;
|
23 | 24 | using System.Text.RegularExpressions;
|
24 | 25 |
|
@@ -249,49 +250,40 @@ private IMongoQuery BuildArrayLengthQuery(Expression variableExpression, Express
|
249 | 250 | {
|
250 | 251 | return null;
|
251 | 252 | }
|
| 253 | + var value = ToInt32(constantExpression); |
252 | 254 |
|
253 | 255 | BsonSerializationInfo serializationInfo = null;
|
254 |
| - var value = ToInt32(constantExpression); |
255 | 256 |
|
256 | 257 | var unaryExpression = variableExpression as UnaryExpression;
|
257 |
| - if (unaryExpression != null) |
| 258 | + if (unaryExpression != null && unaryExpression.NodeType == ExpressionType.ArrayLength) |
258 | 259 | {
|
259 |
| - if (unaryExpression.NodeType == ExpressionType.ArrayLength) |
| 260 | + var arrayMemberExpression = unaryExpression.Operand as MemberExpression; |
| 261 | + if (arrayMemberExpression != null) |
260 | 262 | {
|
261 |
| - var memberExpression = unaryExpression.Operand as MemberExpression; |
262 |
| - if (memberExpression != null) |
263 |
| - { |
264 |
| - serializationInfo = GetSerializationInfo(memberExpression); |
265 |
| - } |
| 263 | + serializationInfo = GetSerializationInfo(arrayMemberExpression); |
266 | 264 | }
|
267 | 265 | }
|
268 | 266 |
|
269 |
| - var countPropertyExpression = variableExpression as MemberExpression; |
270 |
| - if (countPropertyExpression != null) |
| 267 | + var memberExpression = variableExpression as MemberExpression; |
| 268 | + if (memberExpression != null && memberExpression.Member.Name == "Count") |
271 | 269 | {
|
272 |
| - if (countPropertyExpression.Member.Name == "Count") |
| 270 | + var arrayMemberExpression = memberExpression.Expression as MemberExpression; |
| 271 | + if (arrayMemberExpression != null) |
273 | 272 | {
|
274 |
| - var memberExpression = countPropertyExpression.Expression as MemberExpression; |
275 |
| - if (memberExpression != null) |
276 |
| - { |
277 |
| - serializationInfo = GetSerializationInfo(memberExpression); |
278 |
| - } |
| 273 | + serializationInfo = GetSerializationInfo(arrayMemberExpression); |
279 | 274 | }
|
280 | 275 | }
|
281 | 276 |
|
282 |
| - var countMethodCallExpression = variableExpression as MethodCallExpression; |
283 |
| - if (countMethodCallExpression != null) |
| 277 | + var methodCallExpression = variableExpression as MethodCallExpression; |
| 278 | + if (methodCallExpression != null && methodCallExpression.Method.Name == "Count" && methodCallExpression.Method.DeclaringType == typeof(Enumerable)) |
284 | 279 | {
|
285 |
| - if (countMethodCallExpression.Method.Name == "Count") |
| 280 | + var arguments = methodCallExpression.Arguments.ToArray(); |
| 281 | + if (arguments.Length == 1) |
286 | 282 | {
|
287 |
| - var arguments = countMethodCallExpression.Arguments.ToArray(); |
288 |
| - if (arguments.Length == 1) |
| 283 | + var arrayMemberExpression = methodCallExpression.Arguments[0] as MemberExpression; |
| 284 | + if (arrayMemberExpression != null && arrayMemberExpression.Type != typeof(string)) |
289 | 285 | {
|
290 |
| - var memberExpression = countMethodCallExpression.Arguments[0] as MemberExpression; |
291 |
| - if (memberExpression != null) |
292 |
| - { |
293 |
| - serializationInfo = GetSerializationInfo(memberExpression); |
294 |
| - } |
| 286 | + serializationInfo = GetSerializationInfo(arrayMemberExpression); |
295 | 287 | }
|
296 | 288 | }
|
297 | 289 | }
|
@@ -756,23 +748,30 @@ private IMongoQuery BuildStringLengthQuery(Expression variableExpression, Expres
|
756 | 748 | {
|
757 | 749 | return null;
|
758 | 750 | }
|
| 751 | + var value = ToInt32(constantExpression); |
759 | 752 |
|
760 | 753 | BsonSerializationInfo serializationInfo = null;
|
761 |
| - var value = ToInt32(constantExpression); |
762 | 754 |
|
763 |
| - var lengthPropertyExpression = variableExpression as MemberExpression; |
764 |
| - if (lengthPropertyExpression != null) |
| 755 | + var memberExpression = variableExpression as MemberExpression; |
| 756 | + if (memberExpression != null && memberExpression.Member.Name == "Length") |
765 | 757 | {
|
766 |
| - if (lengthPropertyExpression.Member.Name == "Length") |
| 758 | + var stringMemberExpression = memberExpression.Expression as MemberExpression; |
| 759 | + if (stringMemberExpression != null && stringMemberExpression.Type == typeof(string)) |
767 | 760 | {
|
768 |
| - var memberExpression = lengthPropertyExpression.Expression as MemberExpression; |
769 |
| - if (memberExpression != null) |
| 761 | + serializationInfo = GetSerializationInfo(stringMemberExpression); |
| 762 | + } |
| 763 | + } |
| 764 | + |
| 765 | + var methodCallExpression = variableExpression as MethodCallExpression; |
| 766 | + if (methodCallExpression != null && methodCallExpression.Method.Name == "Count" && methodCallExpression.Method.DeclaringType == typeof(Enumerable)) |
| 767 | + { |
| 768 | + var args = methodCallExpression.Arguments.ToArray(); |
| 769 | + if (args.Length == 1) |
| 770 | + { |
| 771 | + var stringMemberExpression = args[0] as MemberExpression; |
| 772 | + if (stringMemberExpression != null && stringMemberExpression.Type == typeof(string)) |
770 | 773 | {
|
771 |
| - serializationInfo = GetSerializationInfo(memberExpression); |
772 |
| - if (serializationInfo != null && serializationInfo.NominalType != typeof(string)) |
773 |
| - { |
774 |
| - serializationInfo = null; |
775 |
| - } |
| 774 | + serializationInfo = GetSerializationInfo(stringMemberExpression); |
776 | 775 | }
|
777 | 776 | }
|
778 | 777 | }
|
|
0 commit comments