diff --git a/src/System.Linq.Dynamic.Core/CustomTypeProviders/IDynamicLinqCustomTypeProvider.cs b/src/System.Linq.Dynamic.Core/CustomTypeProviders/IDynamicLinqCustomTypeProvider.cs
index 4d950612..1adc34e9 100644
--- a/src/System.Linq.Dynamic.Core/CustomTypeProviders/IDynamicLinqCustomTypeProvider.cs
+++ b/src/System.Linq.Dynamic.Core/CustomTypeProviders/IDynamicLinqCustomTypeProvider.cs
@@ -1,38 +1,36 @@
-using JetBrains.Annotations;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Reflection;
-namespace System.Linq.Dynamic.Core.CustomTypeProviders
+namespace System.Linq.Dynamic.Core.CustomTypeProviders;
+
+///
+/// Interface for providing functionality to find custom types for or resolve any type.
+///
+public interface IDynamicLinqCustomTypeProvider
{
///
- /// Interface for providing functionality to find custom types for or resolve any type.
+ /// Returns a list of custom types that System.Linq.Dynamic.Core will understand.
///
- public interface IDynamicLinqCustomTypeProvider
- {
- ///
- /// Returns a list of custom types that System.Linq.Dynamic.Core will understand.
- ///
- /// A list of custom types.
- HashSet GetCustomTypes();
+ /// A list of custom types.
+ HashSet GetCustomTypes();
- ///
- /// Returns a list of custom extension methods that System.Linq.Dynamic.Core will understand.
- ///
- /// A list of custom extension methods that System.Linq.Dynamic.Core will understand.
- Dictionary> GetExtensionMethods();
+ ///
+ /// Returns a list of custom extension methods that System.Linq.Dynamic.Core will understand.
+ ///
+ /// A list of custom extension methods that System.Linq.Dynamic.Core will understand.
+ Dictionary> GetExtensionMethods();
- ///
- /// Resolve any type by fullname which is registered in the current application domain.
- ///
- /// The typename to resolve.
- /// A resolved or null when not found.
- Type? ResolveType(string typeName);
+ ///
+ /// Resolve any type by fullname which is registered in the current application domain.
+ ///
+ /// The typename to resolve.
+ /// A resolved or null when not found.
+ Type? ResolveType(string typeName);
- ///
- /// Resolve any type by the simple name which is registered in the current application domain.
- ///
- /// The typename to resolve.
- /// A resolved or null when not found.
- Type? ResolveTypeBySimpleName(string simpleTypeName);
- }
+ ///
+ /// Resolve any type by the simple name which is registered in the current application domain.
+ ///
+ /// The typename to resolve.
+ /// A resolved or null when not found.
+ Type? ResolveTypeBySimpleName(string simpleTypeName);
}
\ No newline at end of file
diff --git a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs
index e09049d2..d1ea7a90 100644
--- a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs
+++ b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs
@@ -1696,14 +1696,14 @@ private Expression ParseMemberAccess(Type? type, Expression? expression)
}
Expression[] args = ParseArgumentList();
- switch (_methodFinder.FindMethod(type, id, expression == null, ref expression, ref args, out var mb))
+ switch (_methodFinder.FindMethod(type, id, expression == null, ref expression, ref args, out var methodBase))
{
case 0:
throw ParseError(errorPos, Res.NoApplicableMethod, id, TypeHelper.GetTypeName(type));
case 1:
- MethodInfo method = (MethodInfo)mb!;
- if (!PredefinedTypesHelper.IsPredefinedType(_parsingConfig, method.DeclaringType!) && !(method.IsPublic && PredefinedTypesHelper.IsPredefinedType(_parsingConfig, method.ReturnType)))
+ var method = (MethodInfo)methodBase!;
+ if (!PredefinedTypesHelper.IsPredefinedType(_parsingConfig, method.DeclaringType!))
{
throw ParseError(errorPos, Res.MethodsAreInaccessible, TypeHelper.GetTypeName(method.DeclaringType!));
}
diff --git a/src/System.Linq.Dynamic.Core/Parser/PredefinedTypesHelper.cs b/src/System.Linq.Dynamic.Core/Parser/PredefinedTypesHelper.cs
index 3bfe8bb6..fb19e85f 100644
--- a/src/System.Linq.Dynamic.Core/Parser/PredefinedTypesHelper.cs
+++ b/src/System.Linq.Dynamic.Core/Parser/PredefinedTypesHelper.cs
@@ -1,108 +1,109 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq.Dynamic.Core.Validation;
-using System.Text.RegularExpressions;
-namespace System.Linq.Dynamic.Core.Parser
+namespace System.Linq.Dynamic.Core.Parser;
+
+internal static class PredefinedTypesHelper
{
- internal static class PredefinedTypesHelper
- {
- private static readonly string Version = Regex.Match(typeof(PredefinedTypesHelper).AssemblyQualifiedName, @"\d+\.\d+\.\d+\.\d+").ToString();
+#if NETSTANDARD2_0
+ private static readonly string Version = Text.RegularExpressions.Regex.Match(typeof(PredefinedTypesHelper).AssemblyQualifiedName!, @"\d+\.\d+\.\d+\.\d+").ToString();
+#endif
- // These shorthands have different name than actual type and therefore not recognized by default from the PredefinedTypes.
- public static readonly IDictionary PredefinedTypesShorthands = new Dictionary
- {
- { "int", typeof(int) },
- { "uint", typeof(uint) },
- { "short", typeof(short) },
- { "ushort", typeof(ushort) },
- { "long", typeof(long) },
- { "ulong", typeof(ulong) },
- { "bool", typeof(bool) },
- { "float", typeof(float) }
- };
+ // These shorthands have different name than actual type and therefore not recognized by default from the PredefinedTypes.
+ public static readonly IDictionary PredefinedTypesShorthands = new Dictionary
+ {
+ { "int", typeof(int) },
+ { "uint", typeof(uint) },
+ { "short", typeof(short) },
+ { "ushort", typeof(ushort) },
+ { "long", typeof(long) },
+ { "ulong", typeof(ulong) },
+ { "bool", typeof(bool) },
+ { "float", typeof(float) }
+ };
- public static readonly IDictionary PredefinedTypes = new ConcurrentDictionary(new Dictionary {
- { typeof(object), 0 },
- { typeof(bool), 0 },
- { typeof(char), 0 },
- { typeof(string), 0 },
- { typeof(sbyte), 0 },
- { typeof(byte), 0 },
- { typeof(short), 0 },
- { typeof(ushort), 0 },
- { typeof(int), 0 },
- { typeof(uint), 0 },
- { typeof(long), 0 },
- { typeof(ulong), 0 },
- { typeof(float), 0 },
- { typeof(double), 0 },
- { typeof(decimal), 0 },
- { typeof(DateTime), 0 },
- { typeof(DateTimeOffset), 0 },
- { typeof(TimeSpan), 0 },
- { typeof(Guid), 0 },
- { typeof(Math), 0 },
- { typeof(Convert), 0 },
- { typeof(Uri), 0 },
+ public static readonly IDictionary PredefinedTypes = new ConcurrentDictionary(new Dictionary {
+ { typeof(object), 0 },
+ { typeof(bool), 0 },
+ { typeof(char), 0 },
+ { typeof(string), 0 },
+ { typeof(sbyte), 0 },
+ { typeof(byte), 0 },
+ { typeof(short), 0 },
+ { typeof(ushort), 0 },
+ { typeof(int), 0 },
+ { typeof(uint), 0 },
+ { typeof(long), 0 },
+ { typeof(ulong), 0 },
+ { typeof(float), 0 },
+ { typeof(double), 0 },
+ { typeof(decimal), 0 },
+ { typeof(DateTime), 0 },
+ { typeof(DateTimeOffset), 0 },
+ { typeof(TimeSpan), 0 },
+ { typeof(Guid), 0 },
+ { typeof(Math), 0 },
+ { typeof(Convert), 0 },
+ { typeof(Uri), 0 },
#if NET6_0_OR_GREATER
- { typeof(DateOnly), 0 },
- { typeof(TimeOnly), 0 }
+ { typeof(DateOnly), 0 },
+ { typeof(TimeOnly), 0 }
#endif
- });
+ });
- static PredefinedTypesHelper()
- {
+ static PredefinedTypesHelper()
+ {
#if !(NET35 || SILVERLIGHT || NETFX_CORE || WINDOWS_APP || UAP10_0 || NETSTANDARD)
- //System.Data.Entity is always here, so overwrite short name of it with EntityFramework if EntityFramework is found.
- //EF5(or 4.x??), System.Data.Objects.DataClasses.EdmFunctionAttribute
- //There is also an System.Data.Entity, Version=3.5.0.0, but no Functions.
- TryAdd("System.Data.Objects.EntityFunctions, System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 1);
- TryAdd("System.Data.Objects.SqlClient.SqlFunctions, System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 1);
- TryAdd("System.Data.Objects.SqlClient.SqlSpatialFunctions, System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 1);
+ //System.Data.Entity is always here, so overwrite short name of it with EntityFramework if EntityFramework is found.
+ //EF5(or 4.x??), System.Data.Objects.DataClasses.EdmFunctionAttribute
+ //There is also an System.Data.Entity, Version=3.5.0.0, but no Functions.
+ TryAdd("System.Data.Objects.EntityFunctions, System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 1);
+ TryAdd("System.Data.Objects.SqlClient.SqlFunctions, System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 1);
+ TryAdd("System.Data.Objects.SqlClient.SqlSpatialFunctions, System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 1);
- //EF6,System.Data.Entity.DbFunctionAttribute
- TryAdd("System.Data.Entity.Core.Objects.EntityFunctions, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 2);
- TryAdd("System.Data.Entity.DbFunctions, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 2);
- TryAdd("System.Data.Entity.Spatial.DbGeography, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 2);
- TryAdd("System.Data.Entity.SqlServer.SqlFunctions, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 2);
- TryAdd("System.Data.Entity.SqlServer.SqlSpatialFunctions, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 2);
+ //EF6,System.Data.Entity.DbFunctionAttribute
+ TryAdd("System.Data.Entity.Core.Objects.EntityFunctions, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 2);
+ TryAdd("System.Data.Entity.DbFunctions, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 2);
+ TryAdd("System.Data.Entity.Spatial.DbGeography, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 2);
+ TryAdd("System.Data.Entity.SqlServer.SqlFunctions, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 2);
+ TryAdd("System.Data.Entity.SqlServer.SqlSpatialFunctions, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 2);
#endif
#if NETSTANDARD2_0
- TryAdd($"Microsoft.EntityFrameworkCore.DynamicLinq.DynamicFunctions, Microsoft.EntityFrameworkCore.DynamicLinq, Version={Version}, Culture=neutral, PublicKeyToken=974e7e1b462f3693", 3);
+ TryAdd($"Microsoft.EntityFrameworkCore.DynamicLinq.DynamicFunctions, Microsoft.EntityFrameworkCore.DynamicLinq, Version={Version}, Culture=neutral, PublicKeyToken=974e7e1b462f3693", 3);
#endif
- }
+ }
- private static void TryAdd(string typeName, int x)
+ private static void TryAdd(string typeName, int x)
+ {
+ try
{
- try
+ var efType = Type.GetType(typeName);
+ if (efType != null)
{
- Type? efType = Type.GetType(typeName);
- if (efType != null)
- {
- PredefinedTypes.Add(efType, x);
- }
- }
- catch
- {
- // in case of exception, do not add
+ PredefinedTypes.Add(efType, x);
}
}
-
- public static bool IsPredefinedType(ParsingConfig config, Type type)
+ catch
{
- Check.NotNull(config, nameof(config));
- Check.NotNull(type, nameof(type));
+ // in case of exception, do not add
+ }
+ }
- var nonNullableType = TypeHelper.GetNonNullableType(type);
- if (PredefinedTypes.ContainsKey(nonNullableType))
- {
- return true;
- }
+ public static bool IsPredefinedType(ParsingConfig config, Type type)
+ {
+ Check.NotNull(config);
+ Check.NotNull(type);
- return config.CustomTypeProvider != null &&
- (config.CustomTypeProvider.GetCustomTypes().Contains(type) || config.CustomTypeProvider.GetCustomTypes().Contains(nonNullableType));
+ var nonNullableType = TypeHelper.GetNonNullableType(type);
+ if (PredefinedTypes.ContainsKey(nonNullableType))
+ {
+ return true;
}
+
+ // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
+ return config.CustomTypeProvider != null &&
+ (config.CustomTypeProvider.GetCustomTypes().Contains(type) || config.CustomTypeProvider.GetCustomTypes().Contains(nonNullableType));
}
-}
+}
\ No newline at end of file
diff --git a/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs b/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs
index 3bd1332c..83d99980 100644
--- a/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs
+++ b/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs
@@ -8,1530 +8,1549 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using FluentAssertions;
+using Moq;
using NFluent;
using Xunit;
-namespace System.Linq.Dynamic.Core.Tests
+namespace System.Linq.Dynamic.Core.Tests;
+
+public class DynamicExpressionParserTests
{
- public class DynamicExpressionParserTests
+ public class Foo
{
- public class Foo
- {
- public Foo FooValue { get; set; }
+ public Foo FooValue { get; set; }
+
+ public string Zero() => null;
+
+ public string One(int x) => null;
- public string Zero() => null;
+ public string Two(int x, int y) => null;
+ }
+
+ private class MyClass
+ {
+ public List MyStrings { get; set; }
- public string One(int x) => null;
+ public List MyClasses { get; set; }
- public string Two(int x, int y) => null;
+ public int Foo()
+ {
+ return 42;
}
- private class MyClass
+ public void Bar()
{
- public List MyStrings { get; set; }
+ Name = nameof(Foo);
+ }
- public List MyClasses { get; set; }
+ public string Name { get; set; }
- public int Foo()
- {
- return 42;
- }
+ public MyClass Child { get; set; }
+ }
- public void Bar()
- {
- Name = nameof(Foo);
- }
+ private class MyClassCustomTypeProvider : DefaultDynamicLinqCustomTypeProvider
+ {
+ public override HashSet GetCustomTypes()
+ {
+ var customTypes = base.GetCustomTypes();
+ customTypes.Add(typeof(MyClass));
+ return customTypes;
+ }
+ }
- public string Name { get; set; }
+ private class ComplexParseLambda1Result
+ {
+ public int? Age;
+ public int TotalIncome;
+ public string Name;
+ }
- public MyClass Child { get; set; }
- }
+ [DynamicLinqType]
+ public class ComplexParseLambda3Result
+ {
+ public int? Age { get; set; }
+ public int TotalIncome { get; set; }
+ }
+
+ public class CustomClassWithStaticMethod
+ {
+ public static int GetAge(int x) => x;
+ }
- private class MyClassCustomTypeProvider : DefaultDynamicLinqCustomTypeProvider
+ public class CustomTextClass
+ {
+ public CustomTextClass(string origin)
{
- public override HashSet GetCustomTypes()
- {
- var customTypes = base.GetCustomTypes();
- customTypes.Add(typeof(MyClass));
- return customTypes;
- }
+ Origin = origin;
}
- private class ComplexParseLambda1Result
+ public string Origin { get; }
+
+ public static implicit operator string(CustomTextClass customTextValue)
{
- public int? Age;
- public int TotalIncome;
- public string Name;
+ return customTextValue?.Origin;
}
- [DynamicLinqType]
- public class ComplexParseLambda3Result
+ public static implicit operator CustomTextClass(string origin)
{
- public int? Age { get; set; }
- public int TotalIncome { get; set; }
+ return new CustomTextClass(origin);
}
- public class CustomClassWithStaticMethod
+ public override string ToString()
{
- public static int GetAge(int x) => x;
+ return Origin;
}
+ }
- public class CustomTextClass
+ public class CustomClassWithOneWayImplicitConversion
+ {
+ public CustomClassWithOneWayImplicitConversion(string origin)
{
- public CustomTextClass(string origin)
- {
- Origin = origin;
- }
-
- public string Origin { get; }
-
- public static implicit operator string(CustomTextClass customTextValue)
- {
- return customTextValue?.Origin;
- }
+ Origin = origin;
+ }
- public static implicit operator CustomTextClass(string origin)
- {
- return new CustomTextClass(origin);
- }
+ public string Origin { get; }
- public override string ToString()
- {
- return Origin;
- }
+ public static implicit operator CustomClassWithOneWayImplicitConversion(string origin)
+ {
+ return new CustomClassWithOneWayImplicitConversion(origin);
}
- public class CustomClassWithOneWayImplicitConversion
+ public override string ToString()
{
- public CustomClassWithOneWayImplicitConversion(string origin)
- {
- Origin = origin;
- }
-
- public string Origin { get; }
-
- public static implicit operator CustomClassWithOneWayImplicitConversion(string origin)
- {
- return new CustomClassWithOneWayImplicitConversion(origin);
- }
-
- public override string ToString()
- {
- return Origin;
- }
+ return Origin;
}
+ }
- public class CustomClassWithReversedImplicitConversion
+ public class CustomClassWithReversedImplicitConversion
+ {
+ public CustomClassWithReversedImplicitConversion(string origin)
{
- public CustomClassWithReversedImplicitConversion(string origin)
- {
- Origin = origin;
- }
+ Origin = origin;
+ }
- public string Origin { get; }
+ public string Origin { get; }
- public static implicit operator string(CustomClassWithReversedImplicitConversion origin)
- {
- return origin.ToString();
- }
+ public static implicit operator string(CustomClassWithReversedImplicitConversion origin)
+ {
+ return origin.ToString();
+ }
- public override string ToString()
- {
- return Origin;
- }
+ public override string ToString()
+ {
+ return Origin;
}
+ }
- public class CustomClassWithValueTypeImplicitConversion
+ public class CustomClassWithValueTypeImplicitConversion
+ {
+ public CustomClassWithValueTypeImplicitConversion(int origin)
{
- public CustomClassWithValueTypeImplicitConversion(int origin)
- {
- Origin = origin;
- }
+ Origin = origin;
+ }
- public int Origin { get; }
+ public int Origin { get; }
- public static implicit operator CustomClassWithValueTypeImplicitConversion(int origin)
- {
- return new CustomClassWithValueTypeImplicitConversion(origin);
- }
+ public static implicit operator CustomClassWithValueTypeImplicitConversion(int origin)
+ {
+ return new CustomClassWithValueTypeImplicitConversion(origin);
+ }
- public override string ToString()
- {
- return Origin.ToString();
- }
+ public override string ToString()
+ {
+ return Origin.ToString();
}
+ }
- public class CustomClassWithReversedValueTypeImplicitConversion
+ public class CustomClassWithReversedValueTypeImplicitConversion
+ {
+ public CustomClassWithReversedValueTypeImplicitConversion(int origin)
{
- public CustomClassWithReversedValueTypeImplicitConversion(int origin)
- {
- Origin = origin;
- }
+ Origin = origin;
+ }
- public int Origin { get; }
+ public int Origin { get; }
- public static implicit operator int(CustomClassWithReversedValueTypeImplicitConversion origin)
- {
- return origin.Origin;
- }
+ public static implicit operator int(CustomClassWithReversedValueTypeImplicitConversion origin)
+ {
+ return origin.Origin;
+ }
- public override string ToString()
- {
- return Origin.ToString();
- }
+ public override string ToString()
+ {
+ return Origin.ToString();
}
+ }
- public class TestImplicitConversionContainer
+ public class TestImplicitConversionContainer
+ {
+ public TestImplicitConversionContainer(
+ CustomClassWithOneWayImplicitConversion oneWay,
+ CustomClassWithReversedImplicitConversion reversed,
+ CustomClassWithValueTypeImplicitConversion valueType,
+ CustomClassWithReversedValueTypeImplicitConversion reversedValueType)
{
- public TestImplicitConversionContainer(
- CustomClassWithOneWayImplicitConversion oneWay,
- CustomClassWithReversedImplicitConversion reversed,
- CustomClassWithValueTypeImplicitConversion valueType,
- CustomClassWithReversedValueTypeImplicitConversion reversedValueType)
- {
- OneWay = oneWay;
- Reversed = reversed;
- ValueType = valueType;
- ReversedValueType = reversedValueType;
- }
+ OneWay = oneWay;
+ Reversed = reversed;
+ ValueType = valueType;
+ ReversedValueType = reversedValueType;
+ }
- public CustomClassWithOneWayImplicitConversion OneWay { get; }
+ public CustomClassWithOneWayImplicitConversion OneWay { get; }
- public CustomClassWithReversedImplicitConversion Reversed { get; }
+ public CustomClassWithReversedImplicitConversion Reversed { get; }
- public CustomClassWithValueTypeImplicitConversion ValueType { get; }
+ public CustomClassWithValueTypeImplicitConversion ValueType { get; }
- public CustomClassWithReversedValueTypeImplicitConversion ReversedValueType { get; }
- }
+ public CustomClassWithReversedValueTypeImplicitConversion ReversedValueType { get; }
+ }
- public class TextHolder
+ public class TextHolder
+ {
+ public TextHolder(string name, CustomTextClass note)
{
- public TextHolder(string name, CustomTextClass note)
- {
- Name = name;
- Note = note;
- }
+ Name = name;
+ Note = note;
+ }
- public string Name { get; }
+ public string Name { get; }
- public CustomTextClass Note { get; }
+ public CustomTextClass Note { get; }
- public override string ToString()
- {
- return Name + " (" + Note + ")";
- }
+ public override string ToString()
+ {
+ return Name + " (" + Note + ")";
}
+ }
- public static class StaticHelper
+ public static class StaticHelper
+ {
+ public static Guid? GetGuid(string name)
{
- public static Guid? GetGuid(string name)
- {
- return Guid.NewGuid();
- }
+ return Guid.NewGuid();
}
+ }
- public class TestCustomTypeProvider : AbstractDynamicLinqCustomTypeProvider, IDynamicLinkCustomTypeProvider
- {
- private HashSet _customTypes;
+ public class TestCustomTypeProvider : AbstractDynamicLinqCustomTypeProvider, IDynamicLinkCustomTypeProvider
+ {
+ private HashSet _customTypes;
- public virtual HashSet GetCustomTypes()
+ public virtual HashSet GetCustomTypes()
+ {
+ if (_customTypes != null)
{
- if (_customTypes != null)
- {
- return _customTypes;
- }
-
- _customTypes = new HashSet(FindTypesMarkedWithDynamicLinqTypeAttribute(new[] { GetType().GetTypeInfo().Assembly }))
- {
- typeof(CustomClassWithStaticMethod),
- typeof(StaticHelper)
- };
return _customTypes;
}
- public Dictionary> GetExtensionMethods()
+ _customTypes = new HashSet(FindTypesMarkedWithDynamicLinqTypeAttribute(new[] { GetType().GetTypeInfo().Assembly }))
{
- var types = GetCustomTypes();
+ typeof(CustomClassWithStaticMethod),
+ typeof(StaticHelper)
+ };
+ return _customTypes;
+ }
- var list = new List>();
+ public Dictionary> GetExtensionMethods()
+ {
+ var types = GetCustomTypes();
- foreach (var type in types)
- {
- var extensionMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
- .Where(x => x.IsDefined(typeof(ExtensionAttribute), false)).ToList();
+ var list = new List>();
- extensionMethods.ForEach(x => list.Add(new Tuple(x.GetParameters()[0].ParameterType, x)));
- }
+ foreach (var type in types)
+ {
+ var extensionMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
+ .Where(x => x.IsDefined(typeof(ExtensionAttribute), false)).ToList();
- return list.GroupBy(x => x.Item1, tuple => tuple.Item2).ToDictionary(key => key.Key, methods => methods.ToList());
+ extensionMethods.ForEach(x => list.Add(new Tuple(x.GetParameters()[0].ParameterType, x)));
}
- public Type ResolveType(string typeName)
- {
- return Type.GetType(typeName);
- }
+ return list.GroupBy(x => x.Item1, tuple => tuple.Item2).ToDictionary(key => key.Key, methods => methods.ToList());
+ }
- public Type ResolveTypeBySimpleName(string typeName)
- {
- var assemblies = AppDomain.CurrentDomain.GetAssemblies();
- return ResolveTypeBySimpleName(assemblies, typeName);
- }
+ public Type ResolveType(string typeName)
+ {
+ return Type.GetType(typeName);
}
- [Fact]
- public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_false_String()
+ public Type ResolveTypeBySimpleName(string typeName)
{
- // Assign
- var config = new ParsingConfig
- {
- UseParameterizedNamesInDynamicQuery = false
- };
+ var assemblies = AppDomain.CurrentDomain.GetAssemblies();
+ return ResolveTypeBySimpleName(assemblies, typeName);
+ }
+ }
- // Act
- var expression = DynamicExpressionParser.ParseLambda(config, true, "s => s == \"x\"");
+ [Fact]
+ public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_false_String()
+ {
+ // Assign
+ var config = new ParsingConfig
+ {
+ UseParameterizedNamesInDynamicQuery = false
+ };
- // Assert
- ConstantExpression constantExpression = (ConstantExpression)((BinaryExpression)expression.Body).Right;
- object value = constantExpression.Value;
+ // Act
+ var expression = DynamicExpressionParser.ParseLambda(config, true, "s => s == \"x\"");
- Check.That(value).IsEqualTo("x");
- }
+ // Assert
+ ConstantExpression constantExpression = (ConstantExpression)((BinaryExpression)expression.Body).Right;
+ object value = constantExpression.Value;
- [Fact]
- public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_false_DateTime()
+ Check.That(value).IsEqualTo("x");
+ }
+
+ [Fact]
+ public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_false_DateTime()
+ {
+ // Assign
+ var config = new ParsingConfig
{
- // Assign
- var config = new ParsingConfig
- {
- UseParameterizedNamesInDynamicQuery = false
- };
+ UseParameterizedNamesInDynamicQuery = false
+ };
- // Act
- var expression = DynamicExpressionParser.ParseLambda(config, true, "D == \"2022-03-02\"");
+ // Act
+ var expression = DynamicExpressionParser.ParseLambda(config, true, "D == \"2022-03-02\"");
- // Assert
- ConstantExpression constantExpression = (ConstantExpression)((BinaryExpression)expression.Body).Right;
- object value = constantExpression.Value;
+ // Assert
+ ConstantExpression constantExpression = (ConstantExpression)((BinaryExpression)expression.Body).Right;
+ object value = constantExpression.Value;
- Check.That(value).IsEqualTo(new DateTime(2022, 3, 2));
- }
+ Check.That(value).IsEqualTo(new DateTime(2022, 3, 2));
+ }
- [Fact]
- public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_true_Int()
+ [Fact]
+ public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_true_Int()
+ {
+ // Assign
+ var config = new ParsingConfig
{
- // Assign
- var config = new ParsingConfig
- {
- UseParameterizedNamesInDynamicQuery = true
- };
+ UseParameterizedNamesInDynamicQuery = true
+ };
- // Act
- var expression = DynamicExpressionParser.ParseLambda(config, false, "Id = 42");
- var expressionAsString = expression.ToString();
+ // Act
+ var expression = DynamicExpressionParser.ParseLambda(config, false, "Id = 42");
+ var expressionAsString = expression.ToString();
- // Assert
- expressionAsString.Should().Be("Param_0 => (Param_0.Id == value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[System.Int32]).Value)");
+ // Assert
+ expressionAsString.Should().Be("Param_0 => (Param_0.Id == value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[System.Int32]).Value)");
- ConstantExpression constantExpression = (ConstantExpression)((MemberExpression)((BinaryExpression)expression.Body).Right).Expression;
- var wrappedObj = constantExpression!.Value;
+ ConstantExpression constantExpression = (ConstantExpression)((MemberExpression)((BinaryExpression)expression.Body).Right).Expression;
+ var wrappedObj = constantExpression!.Value;
- PropertyInfo propertyInfo = wrappedObj!.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public);
- object value = propertyInfo!.GetValue(wrappedObj);
+ PropertyInfo propertyInfo = wrappedObj!.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public);
+ object value = propertyInfo!.GetValue(wrappedObj);
- Check.That(value).IsEqualTo(42);
- }
+ Check.That(value).IsEqualTo(42);
+ }
- [Fact(Skip = "Issue 645")]
- public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_true_DateTime()
+ [Fact(Skip = "Issue 645")]
+ public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_true_DateTime()
+ {
+ // Assign
+ var config = new ParsingConfig
{
- // Assign
- var config = new ParsingConfig
- {
- UseParameterizedNamesInDynamicQuery = true
- };
+ UseParameterizedNamesInDynamicQuery = true
+ };
- // Act
- var expression = DynamicExpressionParser.ParseLambda(config, false, "D = \"2022-11-16\"");
- var expressionAsString = expression.ToString();
+ // Act
+ var expression = DynamicExpressionParser.ParseLambda(config, false, "D = \"2022-11-16\"");
+ var expressionAsString = expression.ToString();
- // Assert
- expressionAsString.Should().Be("Param_0 => (Param_0.D == value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[System.DateTime]).Value)");
+ // Assert
+ expressionAsString.Should().Be("Param_0 => (Param_0.D == value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[System.DateTime]).Value)");
- ConstantExpression constantExpression = (ConstantExpression)((MemberExpression)((BinaryExpression)expression.Body).Right).Expression;
- var wrappedObj = constantExpression!.Value;
+ ConstantExpression constantExpression = (ConstantExpression)((MemberExpression)((BinaryExpression)expression.Body).Right).Expression;
+ var wrappedObj = constantExpression!.Value;
- PropertyInfo propertyInfo = wrappedObj!.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public);
- object value = propertyInfo!.GetValue(wrappedObj);
+ PropertyInfo propertyInfo = wrappedObj!.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public);
+ object value = propertyInfo!.GetValue(wrappedObj);
- Check.That(value).IsEqualTo(new DateTime(2022, 11, 16));
- }
+ Check.That(value).IsEqualTo(new DateTime(2022, 11, 16));
+ }
- [Theory]
- [InlineData("NullableIntValue", "42")]
- [InlineData("NullableDoubleValue", "42.23")]
- public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_ForNullableProperty_true(string propName, string valueString)
+ [Theory]
+ [InlineData("NullableIntValue", "42")]
+ [InlineData("NullableDoubleValue", "42.23")]
+ public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_ForNullableProperty_true(string propName, string valueString)
+ {
+ // Assign
+ var culture = CultureInfo.CreateSpecificCulture("en-US");
+ var config = new ParsingConfig
{
- // Assign
- var culture = CultureInfo.CreateSpecificCulture("en-US");
- var config = new ParsingConfig
- {
- UseParameterizedNamesInDynamicQuery = true,
- NumberParseCulture = culture
- };
-
- // Act
- var expression = DynamicExpressionParser.ParseLambda(config, false, $"{propName} = {valueString}");
- var expressionAsString = expression.ToString();
+ UseParameterizedNamesInDynamicQuery = true,
+ NumberParseCulture = culture
+ };
- // Assert
- var queriedProp = typeof(SimpleValuesModel).GetProperty(propName, BindingFlags.Instance | BindingFlags.Public)!;
- var queriedPropType = queriedProp.PropertyType;
- var queriedPropUnderlyingType = Nullable.GetUnderlyingType(queriedPropType);
+ // Act
+ var expression = DynamicExpressionParser.ParseLambda(config, false, $"{propName} = {valueString}");
+ var expressionAsString = expression.ToString();
- Check.That(expressionAsString).IsEqualTo($"Param_0 => (Param_0.{propName} == {ExpressionString.NullableConversion($"value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[{queriedPropUnderlyingType}]).Value")})");
- dynamic constantExpression = (ConstantExpression)((MemberExpression)((UnaryExpression)((BinaryExpression)expression.Body).Right).Operand).Expression;
- object wrapperObj = constantExpression.Value;
+ // Assert
+ var queriedProp = typeof(SimpleValuesModel).GetProperty(propName, BindingFlags.Instance | BindingFlags.Public)!;
+ var queriedPropType = queriedProp.PropertyType;
+ var queriedPropUnderlyingType = Nullable.GetUnderlyingType(queriedPropType);
- var propertyInfo = wrapperObj.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public)!;
- var value = propertyInfo.GetValue(wrapperObj);
+ Check.That(expressionAsString).IsEqualTo($"Param_0 => (Param_0.{propName} == {ExpressionString.NullableConversion($"value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[{queriedPropUnderlyingType}]).Value")})");
+ dynamic constantExpression = (ConstantExpression)((MemberExpression)((UnaryExpression)((BinaryExpression)expression.Body).Right).Operand).Expression;
+ object wrapperObj = constantExpression.Value;
- value.Should().Be(Convert.ChangeType(valueString, Nullable.GetUnderlyingType(queriedPropType) ?? queriedPropType, culture));
- }
+ var propertyInfo = wrapperObj.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public)!;
+ var value = propertyInfo.GetValue(wrapperObj);
- [Theory]
- [InlineData("Where(x => x.SnowflakeId == {0})")]
- [InlineData("Where(x => x.SnowflakeId = {0})")]
- public void DynamicExpressionParser_ParseLambda_WithStructWithEquality(string query)
- {
- // Assign
- var testList = User.GenerateSampleModels(51);
- var qry = testList.AsQueryable();
+ value.Should().Be(Convert.ChangeType(valueString, Nullable.GetUnderlyingType(queriedPropType) ?? queriedPropType, culture));
+ }
- // Act
- var expectedX = (ulong)long.MaxValue + 3;
+ [Theory]
+ [InlineData("Where(x => x.SnowflakeId == {0})")]
+ [InlineData("Where(x => x.SnowflakeId = {0})")]
+ public void DynamicExpressionParser_ParseLambda_WithStructWithEquality(string query)
+ {
+ // Assign
+ var testList = User.GenerateSampleModels(51);
+ var qry = testList.AsQueryable();
- query = string.Format(query, expectedX);
- var expression = DynamicExpressionParser.ParseLambda(qry.GetType(), null, query);
- var del = expression.Compile();
- var result = del.DynamicInvoke(qry) as IEnumerable;
+ // Act
+ var expectedX = (ulong)long.MaxValue + 3;
- var expected = qry.Where(gg => gg.SnowflakeId == new SnowflakeId(expectedX)).ToList();
+ query = string.Format(query, expectedX);
+ var expression = DynamicExpressionParser.ParseLambda(qry.GetType(), null, query);
+ var del = expression.Compile();
+ var result = del.DynamicInvoke(qry) as IEnumerable;
- // Assert
- Check.That(result).IsNotNull();
- Check.That(result).HasSize(expected.Count);
- Check.That(result.ToArray()[0]).Equals(expected[0]);
- }
+ var expected = qry.Where(gg => gg.SnowflakeId == new SnowflakeId(expectedX)).ToList();
- [Fact]
- public void DynamicExpressionParser_ParseLambda_ToList()
- {
- // Arrange
- var testList = User.GenerateSampleModels(51);
- var qry = testList.AsQueryable();
-
- // Act
- var query = "OrderBy(gg => gg.Income).ToList()";
- var expression = DynamicExpressionParser.ParseLambda(qry.GetType(), null, query);
- var del = expression.Compile();
- var result = del.DynamicInvoke(qry) as IEnumerable;
-
- var expected = qry.OrderBy(gg => gg.Income).ToList();
-
- // Assert
- Check.That(result).IsNotNull();
- Check.That(result).HasSize(expected.Count);
- Check.That(result.ToArray()[0]).Equals(expected[0]);
- }
+ // Assert
+ Check.That(result).IsNotNull();
+ Check.That(result).HasSize(expected.Count);
+ Check.That(result.ToArray()[0]).Equals(expected[0]);
+ }
- [Fact]
- public void DynamicExpressionParser_ParseLambda_Complex_1()
- {
- // Arrange
- var testList = User.GenerateSampleModels(51);
- var qry = testList.AsQueryable();
+ [Fact]
+ public void DynamicExpressionParser_ParseLambda_ToList()
+ {
+ // Arrange
+ var testList = User.GenerateSampleModels(51);
+ var qry = testList.AsQueryable();
+
+ // Act
+ var query = "OrderBy(gg => gg.Income).ToList()";
+ var expression = DynamicExpressionParser.ParseLambda(qry.GetType(), null, query);
+ var del = expression.Compile();
+ var result = del.DynamicInvoke(qry) as IEnumerable;
+
+ var expected = qry.OrderBy(gg => gg.Income).ToList();
+
+ // Assert
+ Check.That(result).IsNotNull();
+ Check.That(result).HasSize(expected.Count);
+ Check.That(result.ToArray()[0]).Equals(expected[0]);
+ }
- var externals = new Dictionary
- {
- {"Users", qry}
- };
+ [Fact]
+ public void DynamicExpressionParser_ParseLambda_Complex_1()
+ {
+ // Arrange
+ var testList = User.GenerateSampleModels(51);
+ var qry = testList.AsQueryable();
+
+ var externals = new Dictionary
+ {
+ {"Users", qry}
+ };
+
+ // Act
+ var query =
+ "Users.GroupBy(x => new { x.Profile.Age }).OrderBy(gg => gg.Key.Age).Select(j => new (j.Key.Age, j.Sum(k => k.Income) As TotalIncome))";
+ var expression = DynamicExpressionParser.ParseLambda(null, query, externals);
+ var del = expression.Compile();
+ var result = del.DynamicInvoke() as IEnumerable;
+
+ var expected = qry.GroupBy(x => new { x.Profile.Age }).OrderBy(gg => gg.Key.Age)
+ .Select(j => new { j.Key.Age, TotalIncome = j.Sum(k => k.Income) })
+ .Select(c => new ComplexParseLambda1Result { Age = c.Age, TotalIncome = c.TotalIncome }).Cast()
+ .ToArray();
+
+ // Assert
+ Check.That(result).IsNotNull();
+ Check.That(result).HasSize(expected.Length);
+ Check.That(result.ToArray()[0]).Equals(expected[0]);
+ }
- // Act
- var query =
- "Users.GroupBy(x => new { x.Profile.Age }).OrderBy(gg => gg.Key.Age).Select(j => new (j.Key.Age, j.Sum(k => k.Income) As TotalIncome))";
- var expression = DynamicExpressionParser.ParseLambda(null, query, externals);
- var del = expression.Compile();
- var result = del.DynamicInvoke() as IEnumerable;
-
- var expected = qry.GroupBy(x => new { x.Profile.Age }).OrderBy(gg => gg.Key.Age)
- .Select(j => new { j.Key.Age, TotalIncome = j.Sum(k => k.Income) })
- .Select(c => new ComplexParseLambda1Result { Age = c.Age, TotalIncome = c.TotalIncome }).Cast()
- .ToArray();
-
- // Assert
- Check.That(result).IsNotNull();
- Check.That(result).HasSize(expected.Length);
- Check.That(result.ToArray()[0]).Equals(expected[0]);
- }
+ [Fact]
+ public void DynamicExpressionParser_ParseLambda_Complex_2()
+ {
+ // Arrange
+ var testList = User.GenerateSampleModels(51);
+ var qry = testList.AsQueryable();
+
+ // Act
+ var query =
+ "GroupBy(x => new { x.Profile.Age }, it).OrderBy(gg => gg.Key.Age).Select(j => new (j.Key.Age, j.Sum(k => k.Income) As TotalIncome))";
+ var expression = DynamicExpressionParser.ParseLambda(qry.GetType(), null, query);
+ var del = expression.Compile();
+ var result = del.DynamicInvoke(qry) as IEnumerable;
+
+ var expected = qry.GroupBy(x => new { x.Profile.Age }, x => x).OrderBy(gg => gg.Key.Age)
+ .Select(j => new { j.Key.Age, TotalIncome = j.Sum(k => k.Income) })
+ .Select(c => new ComplexParseLambda1Result { Age = c.Age, TotalIncome = c.TotalIncome }).Cast()
+ .ToArray();
+
+ // Assert
+ Check.That(result).IsNotNull();
+ Check.That(result).HasSize(expected.Length);
+ Check.That(result.ToArray()[0]).Equals(expected[0]);
+ }
- [Fact]
- public void DynamicExpressionParser_ParseLambda_Complex_2()
+ [Fact]
+ public void DynamicExpressionParser_ParseLambda_Complex_3()
+ {
+ var config = new ParsingConfig
{
- // Arrange
- var testList = User.GenerateSampleModels(51);
- var qry = testList.AsQueryable();
-
- // Act
- var query =
- "GroupBy(x => new { x.Profile.Age }, it).OrderBy(gg => gg.Key.Age).Select(j => new (j.Key.Age, j.Sum(k => k.Income) As TotalIncome))";
- var expression = DynamicExpressionParser.ParseLambda(qry.GetType(), null, query);
- var del = expression.Compile();
- var result = del.DynamicInvoke(qry) as IEnumerable;
-
- var expected = qry.GroupBy(x => new { x.Profile.Age }, x => x).OrderBy(gg => gg.Key.Age)
- .Select(j => new { j.Key.Age, TotalIncome = j.Sum(k => k.Income) })
- .Select(c => new ComplexParseLambda1Result { Age = c.Age, TotalIncome = c.TotalIncome }).Cast()
- .ToArray();
-
- // Assert
- Check.That(result).IsNotNull();
- Check.That(result).HasSize(expected.Length);
- Check.That(result.ToArray()[0]).Equals(expected[0]);
- }
+ CustomTypeProvider = new TestCustomTypeProvider()
+ };
- [Fact]
- public void DynamicExpressionParser_ParseLambda_Complex_3()
+ // Arrange
+ var testList = User.GenerateSampleModels(51);
+ var qry = testList.AsQueryable();
+
+ var externals = new Dictionary
{
- var config = new ParsingConfig
- {
- CustomTypeProvider = new TestCustomTypeProvider()
- };
+ {"Users", qry}
+ };
- // Arrange
- var testList = User.GenerateSampleModels(51);
- var qry = testList.AsQueryable();
+ // Act
+ var stringExpression =
+ "Users.GroupBy(x => new { x.Profile.Age }).OrderBy(gg => gg.Key.Age).Select(j => new System.Linq.Dynamic.Core.Tests.DynamicExpressionParserTests+ComplexParseLambda3Result{j.Key.Age, j.Sum(k => k.Income) As TotalIncome})";
+ var expression =
+ DynamicExpressionParser.ParseLambda(config, null, stringExpression, externals);
+ var del = expression.Compile();
+ var result = del.DynamicInvoke() as IEnumerable;
- var externals = new Dictionary
- {
- {"Users", qry}
- };
+ var expected = qry.GroupBy(x => new { x.Profile.Age }).OrderBy(gg => gg.Key.Age)
+ .Select(j => new ComplexParseLambda3Result { Age = j.Key.Age, TotalIncome = j.Sum(k => k.Income) })
+ .Cast().ToArray();
- // Act
- var stringExpression =
- "Users.GroupBy(x => new { x.Profile.Age }).OrderBy(gg => gg.Key.Age).Select(j => new System.Linq.Dynamic.Core.Tests.DynamicExpressionParserTests+ComplexParseLambda3Result{j.Key.Age, j.Sum(k => k.Income) As TotalIncome})";
- var expression =
- DynamicExpressionParser.ParseLambda(config, null, stringExpression, externals);
- var del = expression.Compile();
- var result = del.DynamicInvoke() as IEnumerable;
-
- var expected = qry.GroupBy(x => new { x.Profile.Age }).OrderBy(gg => gg.Key.Age)
- .Select(j => new ComplexParseLambda3Result { Age = j.Key.Age, TotalIncome = j.Sum(k => k.Income) })
- .Cast().ToArray();
-
- // Assert
- Check.That(result).IsNotNull();
- Check.That(result).HasSize(expected.Length);
- Check.That(result.ToArray()[0]).Equals(expected[0]);
- }
+ // Assert
+ Check.That(result).IsNotNull();
+ Check.That(result).HasSize(expected.Length);
+ Check.That(result.ToArray()[0]).Equals(expected[0]);
+ }
+
+ [Fact]
+ public void DynamicExpressionParser_ParseLambda_Select_1()
+ {
+ // Arrange
+ var testList = User.GenerateSampleModels(51);
+ var qry = testList.AsQueryable();
- [Fact]
- public void DynamicExpressionParser_ParseLambda_Select_1()
+ var externals = new Dictionary
{
- // Arrange
- var testList = User.GenerateSampleModels(51);
- var qry = testList.AsQueryable();
+ {"Users", qry}
+ };
- var externals = new Dictionary
- {
- {"Users", qry}
- };
+ // Act
+ var query = "Users.Select(j => new User(j.Income As Income))";
+ var expression = DynamicExpressionParser.ParseLambda(null, query, externals);
+ var del = expression.Compile();
+ var result = del.DynamicInvoke();
- // Act
- var query = "Users.Select(j => new User(j.Income As Income))";
- var expression = DynamicExpressionParser.ParseLambda(null, query, externals);
- var del = expression.Compile();
- var result = del.DynamicInvoke();
+ // Assert
+ Assert.NotNull(result);
+ }
- // Assert
- Assert.NotNull(result);
- }
+ [Fact]
+ public void DynamicExpressionParser_ParseLambda_Select_2()
+ {
+ // Arrange
+ var testList = User.GenerateSampleModels(5);
+ var qry = testList.AsQueryable();
- [Fact]
- public void DynamicExpressionParser_ParseLambda_Select_2()
+ var externals = new Dictionary
{
- // Arrange
- var testList = User.GenerateSampleModels(5);
- var qry = testList.AsQueryable();
-
- var externals = new Dictionary
- {
- {"Users", qry}
- };
+ {"Users", qry}
+ };
- // Act
- var query = "Users.Select(j => j)";
- var expression = DynamicExpressionParser.ParseLambda(null, query, externals);
- var del = expression.Compile();
- var result = del.DynamicInvoke();
+ // Act
+ var query = "Users.Select(j => j)";
+ var expression = DynamicExpressionParser.ParseLambda(null, query, externals);
+ var del = expression.Compile();
+ var result = del.DynamicInvoke();
- // Assert
- Assert.NotNull(result);
- }
+ // Assert
+ Assert.NotNull(result);
+ }
- // https://github.com/StefH/System.Linq.Dynamic.Core/issues/58
- [Fact]
- public void DynamicExpressionParser_ParseLambda_Issue58()
+ // https://github.com/StefH/System.Linq.Dynamic.Core/issues/58
+ [Fact]
+ public void DynamicExpressionParser_ParseLambda_Issue58()
+ {
+ // Arrange
+ var customTypeProvider = new Mock();
+ customTypeProvider.Setup(c => c.GetCustomTypes()).Returns(new HashSet { typeof(MyClass) });
+ var config = new ParsingConfig
{
- var expressionParams = new[]
- {
- Expression.Parameter(typeof(MyClass), "myObj")
- };
+ CustomTypeProvider = customTypeProvider.Object
+ };
+ var expressionParams = new[]
+ {
+ Expression.Parameter(typeof(MyClass), "myObj")
+ };
- var myClassInstance = new MyClass();
- var invokersMerge = new List