소스 검색

LuObjectConverter stuff

develop
Robin Thoni 5 년 전
부모
커밋
ced9032e09
32개의 변경된 파일1016개의 추가작업 그리고 624개의 파일을 삭제
  1. 16
    11
      .idea/.idea.luticate2/.idea/contentModel.xml
  2. 10
    12
      Luticate2.Auth.ConsoleSample/Program.cs
  3. 48
    60
      Luticate2.Auth.Tests/Business/Fields/LuDboModelExpressionConverterTests.cs
  4. 9
    7
      Luticate2.Auth.Tests/Business/LuExpressionUtilsTests.cs
  5. 231
    0
      Luticate2.Auth.Tests/Business/ObjectConverter/ObjectConverterTests.cs
  6. 91
    0
      Luticate2.Auth.Tests/Business/ObjectConverter/Objects.cs
  7. 18
    127
      Luticate2.Auth.Tests/RandomTests.cs
  8. 0
    36
      Luticate2.Auth/Business/Auth/DMEC/LuDMECGroupsToModel.cs
  9. 0
    2
      Luticate2.Auth/Business/Auth/LuGroupsBusiness.cs
  10. 0
    1
      Luticate2.Auth/Business/Auth/PartialObjectCopier/LuPOCGroupsToDbo.cs
  11. 4
    27
      Luticate2.Auth/Business/Crud/LuEfCrudBusiness.cs
  12. 13
    0
      Luticate2.Auth/Business/ExpressionConverter/LuExpressionConverterOptions.cs
  13. 280
    0
      Luticate2.Auth/Business/ExpressionConverter/LuExpressionConverterVisitor.cs
  14. 28
    0
      Luticate2.Auth/Business/ExpressionConverter/LuExpressionParamReplaceVisitor.cs
  15. 0
    58
      Luticate2.Auth/Business/Fields/DMEC/LuExpressionConverterEnumerable.cs
  16. 0
    38
      Luticate2.Auth/Business/Fields/DMEC/LuExpressionConverterIdentity.cs
  17. 0
    9
      Luticate2.Auth/Business/Fields/DMEC/LuExpressionConverterOptions.cs
  18. 0
    35
      Luticate2.Auth/Business/Fields/DMEC/LuExpressionConverterStaticMethods.cs
  19. 0
    96
      Luticate2.Auth/Business/Fields/LuExpressionConverter.cs
  20. 0
    88
      Luticate2.Auth/Business/Fields/LuExpressionConverterVisitor.cs
  21. 0
    1
      Luticate2.Auth/Business/Fields/LuFieldsExtensions.cs
  22. 29
    9
      Luticate2.Auth/Business/LuExpressionUtils.cs
  23. 136
    0
      Luticate2.Auth/Business/ObjectConverter/LuObjectConverterDescriptor.cs
  24. 18
    0
      Luticate2.Auth/Business/ObjectConverter/LuObjectConverterDescriptorDbSet.cs
  25. 19
    0
      Luticate2.Auth/Business/ObjectConverter/LuObjectConverterDescriptorEnumerable.cs
  26. 42
    0
      Luticate2.Auth/Business/ObjectConverter/LuObjectConverterDescriptorIdentity.cs
  27. 0
    1
      Luticate2.Auth/DataAccess/Models/LuGroupsObjects.cs
  28. 0
    1
      Luticate2.Auth/DataAccess/Models/LuUsers.cs
  29. 0
    1
      Luticate2.Auth/DataAccess/Models/TestTable.cs
  30. 1
    3
      Luticate2.Auth/DataAccess/Models/luticate2Context.cs
  31. 1
    1
      Luticate2.Auth/Interfaces/ILuExpressionConverter.cs
  32. 22
    0
      Luticate2.Auth/Interfaces/ILuObjectConverterDescriptor.cs

+ 16
- 11
.idea/.idea.luticate2/.idea/contentModel.xml 파일 보기

@@ -13,9 +13,6 @@
13 13
       <e p="Luticate2.Auth" t="IncludeRecursive">
14 14
         <e p="Business" t="Include">
15 15
           <e p="Auth" t="Include">
16
-            <e p="DMEC" t="Include">
17
-              <e p="LuDMECGroupsToModel.cs" t="Include" />
18
-            </e>
19 16
             <e p="LuGroupsBusiness.cs" t="Include" />
20 17
             <e p="PartialObjectCopier" t="Include">
21 18
               <e p="LuPOCGroupsToDbo.cs" t="Include" />
@@ -26,19 +23,22 @@
26 23
           <e p="Crud" t="Include">
27 24
             <e p="LuEfCrudBusiness.cs" t="Include" />
28 25
           </e>
29
-          <e p="Fields" t="Include">
30
-            <e p="DMEC" t="Include">
31
-              <e p="LuExpressionConverterEnumerable.cs" t="Include" />
32
-              <e p="LuExpressionConverterIdentity.cs" t="Include" />
33
-              <e p="LuExpressionConverterOptions.cs" t="Include" />
34
-              <e p="LuExpressionConverterStaticMethods.cs" t="Include" />
35
-            </e>
36
-            <e p="LuExpressionConverter.cs" t="Include" />
26
+          <e p="ExpressionConverter" t="Include">
27
+            <e p="LuExpressionConverterOptions.cs" t="Include" />
37 28
             <e p="LuExpressionConverterVisitor.cs" t="Include" />
29
+            <e p="LuExpressionParamReplaceVisitor.cs" t="Include" />
30
+          </e>
31
+          <e p="Fields" t="Include">
38 32
             <e p="LuFieldsExtensions.cs" t="Include" />
39 33
             <e p="LuPartialFieldsParser.cs" t="Include" />
40 34
           </e>
41 35
           <e p="LuExpressionUtils.cs" t="Include" />
36
+          <e p="ObjectConverter" t="Include">
37
+            <e p="LuObjectConverterDescriptor.cs" t="Include" />
38
+            <e p="LuObjectConverterDescriptorDbSet.cs" t="Include" />
39
+            <e p="LuObjectConverterDescriptorEnumerable.cs" t="Include" />
40
+            <e p="LuObjectConverterDescriptorIdentity.cs" t="Include" />
41
+          </e>
42 42
           <e p="Pagination" t="Include">
43 43
             <e p="LuFilterParser.cs" t="Include" />
44 44
             <e p="LuOrderByParser.cs" t="Include" />
@@ -99,6 +99,7 @@
99 99
         <e p="Interfaces" t="Include">
100 100
           <e p="ILuCrud.cs" t="Include" />
101 101
           <e p="ILuExpressionConverter.cs" t="Include" />
102
+          <e p="ILuObjectConverterDescriptor.cs" t="Include" />
102 103
           <e p="ILuOrderByObjectType.cs" t="Include" />
103 104
           <e p="ILuPartialObjectCopier.cs" t="Include" />
104 105
         </e>
@@ -136,6 +137,10 @@
136 137
             <e p="LuFieldDboTests.cs" t="Include" />
137 138
           </e>
138 139
           <e p="LuExpressionUtilsTests.cs" t="Include" />
140
+          <e p="ObjectConverter" t="Include">
141
+            <e p="ObjectConverterTests.cs" t="Include" />
142
+            <e p="Objects.cs" t="Include" />
143
+          </e>
139 144
           <e p="Pagination" t="Include">
140 145
             <e p="LuFilterTests.cs" t="Include" />
141 146
           </e>

+ 10
- 12
Luticate2.Auth.ConsoleSample/Program.cs 파일 보기

@@ -1,9 +1,7 @@
1 1
 using System;
2 2
 using System.Collections.Generic;
3 3
 using Luticate2.Auth.Business.Auth;
4
-using Luticate2.Auth.Business.Auth.DMEC;
5 4
 using Luticate2.Auth.Business.Auth.PartialObjectCopier;
6
-using Luticate2.Auth.Business.Fields.DMEC;
7 5
 using Luticate2.Auth.ConsoleSample.Commands;
8 6
 using Luticate2.Auth.DataAccess;
9 7
 using Luticate2.Auth.DataAccess.Models;
@@ -33,12 +31,12 @@ namespace Luticate2.Auth.ConsoleSample
33 31
     {
34 32
         public static IServiceProvider ServiceProvider;
35 33
 
36
-        protected static void AddILuExpressionConverter<TTypeFrom, TTypeTo, TTypeImpl>(IServiceCollection services)
37
-            where TTypeImpl : class, ILuExpressionConverter<TTypeFrom, TTypeTo>
38
-        {
39
-            services.AddSingleton<ILuExpressionConverter<TTypeFrom, TTypeTo>, TTypeImpl>();
40
-            services.TryAddSingleton<ILuExpressionConverter<TTypeFrom>, TTypeImpl>();
41
-        }
34
+//        protected static void AddILuExpressionConverter<TTypeFrom, TTypeTo, TTypeImpl>(IServiceCollection services)
35
+//            where TTypeImpl : class, ILuExpressionConverter<TTypeFrom, TTypeTo>
36
+//        {
37
+//            services.AddSingleton<ILuExpressionConverter<TTypeFrom, TTypeTo>, TTypeImpl>();
38
+//            services.TryAddSingleton<ILuExpressionConverter<TTypeFrom>, TTypeImpl>();
39
+//        }
42 40
         
43 41
         static void Main(string[] args)
44 42
         {
@@ -52,10 +50,10 @@ namespace Luticate2.Auth.ConsoleSample
52 50
 
53 51
 
54 52
 //            services.AddSingleton<ILuDboModelExpressionConverter<TestDbo1, TestModel1>, LuDMECTest1>();
55
-            AddILuExpressionConverter<LuGroupDbo, LuGroups, LuDMECGroupsToModel>(services);
56
-            AddILuExpressionConverter<string, string, LuExpressionConverterIdentity<string>>(services);
57
-            AddILuExpressionConverter<Guid, Guid, LuExpressionConverterIdentity<Guid>>(services);
58
-            AddILuExpressionConverter<bool, bool, LuExpressionConverterIdentity<bool>>(services);
53
+//            AddILuExpressionConverter<LuGroupDbo, LuGroups, LuDMECGroupsToModel>(services);
54
+//            AddILuExpressionConverter<string, string, LuExpressionConverterIdentity<string>>(services);
55
+//            AddILuExpressionConverter<Guid, Guid, LuExpressionConverterIdentity<Guid>>(services);
56
+//            AddILuExpressionConverter<bool, bool, LuExpressionConverterIdentity<bool>>(services);
59 57
 
60 58
 
61 59
 //            services.AddSingleton<ILuFieldsExpressions<LuObjectsMetadataDbo, LuObjectsMetadata>, LuFieldsExpressionsLuMetadataDboLuMetadata>();

+ 48
- 60
Luticate2.Auth.Tests/Business/Fields/LuDboModelExpressionConverterTests.cs 파일 보기

@@ -4,7 +4,7 @@ using System.Linq.Expressions;
4 4
 using System.Reflection;
5 5
 using Luticate2.Auth.Business;
6 6
 using Luticate2.Auth.Business.Fields;
7
-using Luticate2.Auth.Business.Fields.DMEC;
7
+using Luticate2.Auth.Business.ObjectConverter;
8 8
 using Luticate2.Auth.Dbo;
9 9
 using Luticate2.Auth.Dbo.Result;
10 10
 using Luticate2.Auth.Interfaces;
@@ -13,6 +13,13 @@ using Xunit;
13 13
 
14 14
 namespace Luticate2.Auth.Tests.Business.Fields
15 15
 {
16
+    public static class StaticDbo
17
+    {
18
+        public static bool StaticField;
19
+
20
+        public static bool StaticProperty { get; set; }
21
+    }
22
+
16 23
     public class TestDbo1
17 24
     {
18 25
         public Guid Id { get; set; }
@@ -20,6 +27,11 @@ namespace Luticate2.Auth.Tests.Business.Fields
20 27
         public string Name { get; set; }
21 28
 
22 29
         public IList<TestDbo2> TestDbo2s { get; set; }
30
+
31
+        public string ToString()
32
+        {
33
+            throw new NotImplementedException();
34
+        }
23 35
     }
24 36
 
25 37
     public class TestDbo2
@@ -28,84 +40,60 @@ namespace Luticate2.Auth.Tests.Business.Fields
28 40
 
29 41
         public string Name { get; set; }
30 42
 
43
+        public string NameVirtual { get; set; }
44
+
31 45
         public TestDbo1 TestDbo1 { get; set; }
46
+
47
+        public TestDbo2 Parent { get; set; }
48
+
49
+        public TestModel1 Unused { get; set; }
32 50
     }
33 51
 
34 52
     public class TestModel1
35 53
     {
36
-        public Guid Id { get; set; }
54
+        public Guid id { get; set; }
37 55
 
38
-        public string Name { get; set; }
56
+        public string name { get; set; }
39 57
 
40
-        public ICollection<TestModel2> TestModel2 { get; set; }
58
+        public ICollection<TestModel2> test_model2 { get; set; }
41 59
     }
42 60
 
43 61
     public class TestModel2
44 62
     {
45
-        public Guid Id { get; set; }
63
+        public Guid id { get; set; }
46 64
 
47
-        public string Name { get; set; }
65
+        public string name { get; set; }
48 66
 
49
-        public Guid TestModel1Id { get; set; }
67
+        public Guid test_model1_id { get; set; }
50 68
 
51
-        public TestModel1 TestModel1 { get; set; }
69
+        public TestModel1 test_model1 { get; set; }
70
+
71
+        public TestModel2 parent { get; set; }
52 72
     }
53 73
 
54
-    public class LuDMECTest1 : LuExpressionConverter<TestDbo1, TestModel1>
74
+    public class LuDMECTest1 : LuObjectConverterDescriptor<TestDbo1, TestModel1>
55 75
     {
56
-        public LuDMECTest1(IServiceProvider serviceProvider) : base(serviceProvider)
57
-        {
58
-        }
59
-
60
-        protected override LuResult<Expression> ConvertInternal(Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
76
+        public LuDMECTest1()
61 77
         {
62
-            var expression = expressions.Peek();
63
-            if (expression is MemberExpression memberExpression)
64
-            {
65
-                if (MemberMatch(x => x.Id, memberExpression))
66
-                {
67
-                    return MakeMemberAccess(x => x.Id, expressions, baseExpression, options);
68
-                }
69
-                if (MemberMatch(x => x.Name, memberExpression))
70
-                {
71
-                    return MakeMemberAccess(x => x.Name, expressions, baseExpression, options);
72
-                }
73
-                if (MemberMatch(x => x.TestDbo2s, memberExpression))
74
-                {
75
-                    return MakeMemberAccess(x => x.TestModel2, expressions, baseExpression, options);
76
-                }
77
-            }
78
-
79
-            return base.ConvertInternal(expressions, baseExpression, options);
78
+            AddMemberConverter(x => x.Id, y => y.id, PropertyType.Value);
79
+            AddMemberConverter(x => x.Name, y => y.name, PropertyType.Value);
80
+            AddMemberConverter(x => x.TestDbo2s, y => y.test_model2, PropertyType.Object);
81
+            AddStaticMethodConverter(
82
+                (Expression<Func<TestDbo1, string>>)(x => x.ToString()),
83
+                (Expression<Func<TestModel1, string>>)(x => x.id + ": " + x.name)
84
+            );
80 85
         }
81 86
     }
82 87
 
83
-    public class LuDMECTest2 : LuExpressionConverter<TestDbo2, TestModel2>
88
+    public class LuDMECTest2 : LuObjectConverterDescriptor<TestDbo2, TestModel2>
84 89
     {
85
-        public LuDMECTest2(IServiceProvider serviceProvider) : base(serviceProvider)
86
-        {
87
-        }
88
-
89
-        protected override LuResult<Expression> ConvertInternal(Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
90
+        public LuDMECTest2()
90 91
         {
91
-            var expression = expressions.Peek();
92
-            if (expression is MemberExpression memberExpression)
93
-            {
94
-                if (MemberMatch(x => x.Id, memberExpression))
95
-                {
96
-                    return MakeMemberAccess(x => x.Id, expressions, baseExpression, options);
97
-                }
98
-                if (MemberMatch(x => x.Name, memberExpression))
99
-                {
100
-                    return MakeMemberAccess(x => x.Name, expressions, baseExpression, options);
101
-                }
102
-                if (MemberMatch(x => x.TestDbo1, memberExpression))
103
-                {
104
-                    return MakeMemberAccess(x => x.TestModel1, expressions, baseExpression, options);
105
-                }
106
-            }
107
-
108
-            return base.ConvertInternal(expressions, baseExpression, options);
92
+            AddMemberConverter(x => x.Id, y => y.id, PropertyType.Value);
93
+            AddMemberConverter(x => x.Name, y => y.name, PropertyType.Value);
94
+            AddMemberConverter(x => x.NameVirtual, y => y.name + " " + y.name, PropertyType.Value);
95
+            AddMemberConverter(x => x.TestDbo1, y => y.test_model1, PropertyType.Object);
96
+            AddMemberConverter(x => x.Parent, y => y.parent, PropertyType.Object);
109 97
         }
110 98
     }
111 99
 
@@ -114,10 +102,10 @@ namespace Luticate2.Auth.Tests.Business.Fields
114 102
         public IServiceProvider GetServiceProvider()
115 103
         {
116 104
             var services = new ServiceCollection();
117
-            services.AddSingleton<ILuExpressionConverter<TestDbo1, TestModel1>, LuDMECTest1>();
118
-            services.AddSingleton<ILuExpressionConverter<TestDbo2, TestModel2>, LuDMECTest2>();
119
-            services.AddSingleton<ILuExpressionConverter<string, string>, LuExpressionConverterIdentity<string>>();
120
-            services.AddSingleton<ILuExpressionConverter<Guid, Guid>, LuExpressionConverterIdentity<Guid>>();
105
+//            services.AddSingleton<ILuExpressionConverter<TestDbo1, TestModel1>, LuDMECTest1>();
106
+//            services.AddSingleton<ILuExpressionConverter<TestDbo2, TestModel2>, LuDMECTest2>();
107
+//            services.AddSingleton<ILuExpressionConverter<string, string>, LuExpressionConverterIdentity<string>>();
108
+//            services.AddSingleton<ILuExpressionConverter<Guid, Guid>, LuExpressionConverterIdentity<Guid>>();
121 109
 
122 110
             var serviceProvider = services.BuildServiceProvider();
123 111
             return serviceProvider;

+ 9
- 7
Luticate2.Auth.Tests/Business/LuExpressionUtilsTests.cs 파일 보기

@@ -1,4 +1,6 @@
1
-using System.Linq;
1
+using System;
2
+using System.Linq;
3
+using System.Linq.Expressions;
2 4
 using Luticate2.Auth.Business;
3 5
 using Xunit;
4 6
 
@@ -25,7 +27,7 @@ namespace Luticate2.Auth.Tests.Business
25 27
         [Fact]
26 28
         public void GetSingleMemberFromExpression1()
27 29
         {
28
-            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression<TestDbo1, string>(x => x.MyString);
30
+            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression((Expression<Func<TestDbo1, string>>)(x => x.MyString));
29 31
             Assert.NotNull(memberInfo);
30 32
             Assert.Equal("MyString", memberInfo.Name);
31 33
         }
@@ -33,7 +35,7 @@ namespace Luticate2.Auth.Tests.Business
33 35
         [Fact]
34 36
         public void GetSingleMemberFromExpression2()
35 37
         {
36
-            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression<TestDbo1, TestDbo2>(x => x.TestDbo2);
38
+            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression((Expression<Func<TestDbo1, TestDbo2>>)(x => x.TestDbo2));
37 39
             Assert.NotNull(memberInfo);
38 40
             Assert.Equal("TestDbo2", memberInfo.Name);
39 41
         }
@@ -41,28 +43,28 @@ namespace Luticate2.Auth.Tests.Business
41 43
         [Fact]
42 44
         public void GetSingleMemberFromExpression3()
43 45
         {
44
-            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression<TestDbo1, TestDbo1>(x => x);
46
+            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression((Expression<Func<TestDbo1, TestDbo1>>)(x => x));
45 47
             Assert.Null(memberInfo);
46 48
         }
47 49
         
48 50
         [Fact]
49 51
         public void GetSingleMemberFromExpression4()
50 52
         {
51
-            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression<TestDbo1, int>(x => 42);
53
+            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression((Expression<Func<TestDbo1, int>>)(x => 42));
52 54
             Assert.Null(memberInfo);
53 55
         }
54 56
         
55 57
         [Fact]
56 58
         public void GetSingleMemberFromExpression5()
57 59
         {
58
-            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression<TestDbo1, int>(x => x.TestDbo2.MyInt);
60
+            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression((Expression<Func<TestDbo1, int>>)(x => x.TestDbo2.MyInt));
59 61
             Assert.Null(memberInfo);
60 62
         }
61 63
         
62 64
         [Fact]
63 65
         public void GetSingleMemberFromExpression6()
64 66
         {
65
-            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression<TestDbo1, int>(x => x.TestDbo2.RecursiveObject.MyInt);
67
+            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression((Expression<Func<TestDbo1, int>>)(x => x.TestDbo2.RecursiveObject.MyInt));
66 68
             Assert.Null(memberInfo);
67 69
         }
68 70
 

+ 231
- 0
Luticate2.Auth.Tests/Business/ObjectConverter/ObjectConverterTests.cs 파일 보기

@@ -0,0 +1,231 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq;
4
+using System.Linq.Expressions;
5
+using Luticate2.Auth.Business.ExpressionConverter;
6
+using Luticate2.Auth.Business.ObjectConverter;
7
+using Luticate2.Auth.Interfaces;
8
+using Microsoft.Extensions.DependencyInjection;
9
+using Xunit;
10
+
11
+namespace Luticate2.Auth.Tests.Business.ObjectConverter
12
+{
13
+    public class ObjectConverterTests
14
+    {
15
+
16
+        protected IServiceProvider GetServiceProvider()
17
+        {
18
+            var typeILuObjectConverterDescriptor = typeof(ILuObjectConverterDescriptor<,>);
19
+            var typeILuObjectConverterDescriptorEnumerable =
20
+                typeILuObjectConverterDescriptor.MakeGenericType(typeof(Enumerable), typeof(Enumerable));
21
+
22
+            var services = new ServiceCollection();
23
+            services.AddSingleton<ILuObjectConverterDescriptorIdentity, LuObjectConverterDescriptorIdentity>();
24
+            services.AddSingleton(typeILuObjectConverterDescriptorEnumerable, typeof(LuObjectConverterDescriptorEnumerable));
25
+            services.AddSingleton<ILuObjectConverterDescriptor<TestDbo1, TestModel1>, LuOcdTest1>();
26
+            services.AddSingleton<ILuObjectConverterDescriptor<TestDbo2, TestModel2>, LuOcdTest2>();
27
+
28
+            var serviceProvider = services.BuildServiceProvider();
29
+            return serviceProvider;
30
+        }
31
+
32
+        protected LuExpressionConverterOptions GetConverterOptions()
33
+        {
34
+            var options = new LuExpressionConverterOptions
35
+            {
36
+                Parameters = new Dictionary<ParameterExpression, Expression>(),
37
+                Types = new Dictionary<Type, Type>
38
+                {
39
+                    {typeof(TestDbo1), typeof(TestModel1)},
40
+                    {typeof(TestDbo2), typeof(TestModel2)}
41
+                }
42
+            };
43
+            return options;
44
+        }
45
+
46
+        protected LuExpressionConverterVisitor GetConverter()
47
+        {
48
+            return new LuExpressionConverterVisitor(GetConverterOptions(), GetServiceProvider());
49
+        }
50
+
51
+        [Fact]
52
+        public void TestSimpleProperty1()
53
+        {
54
+            Expression<Func<TestDbo2, Guid>> expDbo = (x => x.TestDbo1.Id);
55
+            Expression<Func<TestModel2, Guid>> expModel = (Param_0 => Param_0.test_model1.id);
56
+            var converter = GetConverter();
57
+            var result = converter.Visit(expDbo);
58
+            Assert.Equal(expModel.ToString(), result?.ToString());
59
+        }
60
+
61
+        [Fact]
62
+        public void TestSimpleProperty2()
63
+        {
64
+            Expression<Func<TestDbo2, bool>> expDbo = (x => x.TestDbo1.Id == Guid.Empty);
65
+            Expression<Func<TestModel2, bool>> expModel = (Param_0 => Param_0.test_model1.id == Guid.Empty);
66
+            var converter = GetConverter();
67
+            var result = converter.Visit(expDbo);
68
+            Assert.Equal(expModel.ToString(), result?.ToString());
69
+        }
70
+
71
+        [Fact]
72
+        public void TestSimpleProperty3()
73
+        {
74
+            Expression<Func<TestDbo2, bool>> expDbo = (x => x.TestDbo1.Name.Length == 2);
75
+            Expression<Func<TestModel2, bool>> expModel = (Param_0 => Param_0.test_model1.name.Length == 2);
76
+            var converter = GetConverter();
77
+            var result = converter.Visit(expDbo);
78
+            Assert.Equal(expModel.ToString(), result?.ToString());
79
+        }
80
+
81
+        [Fact]
82
+        public void TestStaticProperty1()
83
+        {
84
+            Expression<Func<TestDbo2, bool>> expDbo = (x => (x.TestDbo1.Name == "42") == StaticDbo.StaticField);
85
+            Expression<Func<TestModel2, bool>> expModel = (Param_0 => (Param_0.test_model1.name == "42") == StaticDbo.StaticField);
86
+            var converter = GetConverter();
87
+            var result = converter.Visit(expDbo);
88
+            Assert.Equal(expModel.ToString(), result?.ToString());
89
+        }
90
+
91
+        [Fact]
92
+        public void TestStaticProperty2()
93
+        {
94
+            Expression<Func<TestDbo2, bool>> expDbo = (x => (x.TestDbo1.Name == "42") == StaticDbo.StaticProperty);
95
+            Expression<Func<TestModel2, bool>> expModel = (Param_0 => (Param_0.test_model1.name == "42") == StaticDbo.StaticProperty);
96
+            var converter = GetConverter();
97
+            var result = converter.Visit(expDbo);
98
+            Assert.Equal(expModel.ToString(), result?.ToString());
99
+        }
100
+
101
+        [Fact]
102
+        public void TestVirtualProperty1()
103
+        {
104
+            Expression<Func<TestDbo2, string>> expDbo = (x => x.NameVirtual);
105
+            Expression<Func<TestModel2, string>> expModel = (Param_0 => Param_0.name + " " + Param_0.name);
106
+            var converter = GetConverter();
107
+            var result = converter.Visit(expDbo);
108
+            Assert.Equal(expModel.ToString(), result?.ToString());
109
+        }
110
+
111
+        [Fact]
112
+        public void TestVirtualProperty2()
113
+        {
114
+            Expression<Func<TestDbo2, string>> expDbo = (x => x.Parent.NameVirtual);
115
+            Expression<Func<TestModel2, string>> expModel = (Param_0 => Param_0.parent.name + " " + Param_0.parent.name);
116
+            var converter = GetConverter();
117
+            var result = converter.Visit(expDbo);
118
+            Assert.Equal(expModel.ToString(), result?.ToString());
119
+        }
120
+
121
+        [Fact]
122
+        public void TestStaticValue1()
123
+        {
124
+            Expression<Func<TestDbo2, int>> expDbo = (x => 0);
125
+            Expression<Func<TestModel2, int>> expModel = (Param_0 => 0);
126
+            var converter = GetConverter();
127
+            var result = converter.Visit(expDbo);
128
+            Assert.Equal(expModel.ToString(), result?.ToString());
129
+        }
130
+
131
+        [Fact]
132
+        public void TestStaticValue2()
133
+        {
134
+            Expression<Func<TestDbo2, TestDbo2>> expDbo = (x => x);
135
+            Expression<Func<TestModel2, TestModel2>> expModel = (Param_0 => Param_0);
136
+            var converter = GetConverter();
137
+            var result = converter.Visit(expDbo);
138
+            Assert.Equal(expModel.ToString(), result?.ToString());
139
+        }
140
+
141
+        [Fact]
142
+        public void TestStaticValue3()
143
+        {
144
+            Expression<Func<TestDbo2, bool>> expDbo = (x => StaticDbo.StaticField);
145
+            Expression<Func<TestModel2, bool>> expModel = (Param_0 => StaticDbo.StaticField);
146
+            var converter = GetConverter();
147
+            var result = converter.Visit(expDbo);
148
+            Assert.Equal(expModel.ToString(), result?.ToString());
149
+        }
150
+
151
+        [Fact]
152
+        public void TestComplexExpression1()
153
+        {
154
+            Expression<Func<TestDbo2, int>> expDbo = (x => (x.Name + " " + x.Name).Length);
155
+            Expression<Func<TestModel2, int>> expModel = (Param_0 => (Param_0.name + " " + Param_0.name).Length);
156
+            var converter = GetConverter();
157
+            var result = converter.Visit(expDbo);
158
+            Assert.Equal(expModel.ToString(), result?.ToString());
159
+        }
160
+
161
+        [Fact]
162
+        public void TestComplexExpression2()
163
+        {
164
+            Expression<Func<TestDbo2, int>> expDbo = (x => (x.NameVirtual + " " + x.Name).Length);
165
+            Expression<Func<TestModel2, int>> expModel = (Param_0 => (Param_0.name + " " + Param_0.name + " " + Param_0.name).Length);
166
+            var converter = GetConverter();
167
+            var result = converter.Visit(expDbo);
168
+            Assert.Equal(expModel.ToString(), result?.ToString());
169
+        }
170
+
171
+        [Fact]
172
+        public void TestSimpleMethodSimpleArg1()
173
+        {
174
+            Expression<Func<TestDbo2, bool>> expDbo = (x => x.Name.Contains("s"));
175
+            Expression<Func<TestModel2, bool>> expModel = (Param_0 => Param_0.name.Contains("s"));
176
+            var converter = GetConverter();
177
+            var result = converter.Visit(expDbo);
178
+            Assert.Equal(expModel.ToString(), result?.ToString());
179
+        }
180
+
181
+        [Fact]
182
+        public void TestSimpleMethodSimpleArg2()
183
+        {
184
+            Expression<Func<TestDbo2, bool>> expDbo = (x => x.TestDbo1.Name.Contains("s"));
185
+            Expression<Func<TestModel2, bool>> expModel = (Param_0 => Param_0.test_model1.name.Contains("s"));
186
+            var converter = GetConverter();
187
+            var result = converter.Visit(expDbo);
188
+            Assert.Equal(expModel.ToString(), result?.ToString());
189
+        }
190
+
191
+        [Fact]
192
+        public void TestSimpleMethodSimpleArg3()
193
+        {
194
+            Expression<Func<TestDbo2, string>> expDbo = (x => x.TestDbo1.ToString());
195
+            Expression<Func<TestModel2, string>> expModel = (Param_0 => Param_0.test_model1.id + ": " + Param_0.test_model1.name);
196
+            var converter = GetConverter();
197
+            var result = converter.Visit(expDbo);
198
+            Assert.Equal(expModel.ToString(), result?.ToString());
199
+        }
200
+
201
+        [Fact]
202
+        public void TestSimpleMethodAdvArg1()
203
+        {
204
+            Expression<Func<TestDbo2, bool>> expDbo = (x => x.TestDbo1.Name.Contains(x.Name));
205
+            Expression<Func<TestModel2, bool>> expModel = (Param_0 => Param_0.test_model1.name.Contains(Param_0.name));
206
+            var converter = GetConverter();
207
+            var result = converter.Visit(expDbo);
208
+            Assert.Equal(expModel.ToString(), result?.ToString());
209
+        }
210
+
211
+        [Fact]
212
+        public void TestAdvMethodSimpleArg1()
213
+        {
214
+            Expression<Func<TestDbo1, bool>> expDbo = (x => x.TestDbo2s.Any());
215
+            Expression<Func<TestModel1, bool>> expModel = (Param_0 => Param_0.test_model2.Any());
216
+            var converter = GetConverter();
217
+            var result = converter.Visit(expDbo);
218
+            Assert.Equal(expModel.ToString(), result?.ToString());
219
+        }
220
+
221
+        [Fact]
222
+        public void TestAdvMethodAdvArg1()
223
+        {
224
+            Expression<Func<TestDbo1, bool>> expDbo = (x => x.TestDbo2s.Any(y => y.Name.Contains(x.Name + "s")));
225
+            Expression<Func<TestModel1, bool>> expModel = (Param_0 => Param_0.test_model2.Any(Param_1 => Param_1.name.Contains(Param_0.name + "s")));
226
+            var converter = GetConverter();
227
+            var result = converter.Visit(expDbo);
228
+            Assert.Equal(expModel.ToString(), result?.ToString());
229
+        }
230
+    }
231
+}

+ 91
- 0
Luticate2.Auth.Tests/Business/ObjectConverter/Objects.cs 파일 보기

@@ -0,0 +1,91 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq.Expressions;
4
+using Luticate2.Auth.Business.ObjectConverter;
5
+
6
+namespace Luticate2.Auth.Tests.Business.ObjectConverter
7
+{
8
+    public static class StaticDbo
9
+    {
10
+        public static bool StaticField;
11
+
12
+        public static bool StaticProperty { get; set; }
13
+    }
14
+
15
+    public class TestDbo1
16
+    {
17
+        public Guid Id { get; set; }
18
+
19
+        public string Name { get; set; }
20
+
21
+        public IList<TestDbo2> TestDbo2s { get; set; }
22
+
23
+        public string ToString()
24
+        {
25
+            throw new NotImplementedException();
26
+        }
27
+    }
28
+
29
+    public class TestDbo2
30
+    {
31
+        public Guid Id { get; set; }
32
+
33
+        public string Name { get; set; }
34
+
35
+        public string NameVirtual { get; set; }
36
+
37
+        public TestDbo1 TestDbo1 { get; set; }
38
+
39
+        public TestDbo2 Parent { get; set; }
40
+
41
+        public TestModel1 Unused { get; set; }
42
+    }
43
+
44
+    public class TestModel1
45
+    {
46
+        public Guid id { get; set; }
47
+
48
+        public string name { get; set; }
49
+
50
+        public ICollection<TestModel2> test_model2 { get; set; }
51
+    }
52
+
53
+    public class TestModel2
54
+    {
55
+        public Guid id { get; set; }
56
+
57
+        public string name { get; set; }
58
+
59
+        public Guid test_model1_id { get; set; }
60
+
61
+        public TestModel1 test_model1 { get; set; }
62
+
63
+        public TestModel2 parent { get; set; }
64
+    }
65
+
66
+    public class LuOcdTest1 : LuObjectConverterDescriptor<TestDbo1, TestModel1>
67
+    {
68
+        public LuOcdTest1()
69
+        {
70
+            AddMemberConverter(x => x.Id, y => y.id, PropertyType.Value);
71
+            AddMemberConverter(x => x.Name, y => y.name, PropertyType.Value);
72
+            AddMemberConverter(x => x.TestDbo2s, y => y.test_model2, PropertyType.Object);
73
+            AddStaticMethodConverter(
74
+                (Expression<Func<TestDbo1, string>>)(x => x.ToString()),
75
+                (Expression<Func<TestModel1, string>>)(x => x.id + ": " + x.name)
76
+            );
77
+        }
78
+    }
79
+
80
+    public class LuOcdTest2 : LuObjectConverterDescriptor<TestDbo2, TestModel2>
81
+    {
82
+        public LuOcdTest2()
83
+        {
84
+            AddMemberConverter(x => x.Id, y => y.id, PropertyType.Value);
85
+            AddMemberConverter(x => x.Name, y => y.name, PropertyType.Value);
86
+            AddMemberConverter(x => x.NameVirtual, y => y.name + " " + y.name, PropertyType.Value);
87
+            AddMemberConverter(x => x.TestDbo1, y => y.test_model1, PropertyType.Object);
88
+            AddMemberConverter(x => x.Parent, y => y.parent, PropertyType.Object);
89
+        }
90
+    }
91
+}

+ 18
- 127
Luticate2.Auth.Tests/RandomTests.cs 파일 보기

@@ -1,12 +1,13 @@
1 1
 using System;
2
+using System.Collections.Generic;
2 3
 using System.Linq;
3 4
 using System.Linq.Expressions;
4
-using Luticate2.Auth.Business.Fields;
5
-using Luticate2.Auth.Business.Fields.DMEC;
5
+using Luticate2.Auth.Business.ExpressionConverter;
6
+using Luticate2.Auth.Business.ObjectConverter;
7
+using Luticate2.Auth.DataAccess.Models;
6 8
 using Luticate2.Auth.Interfaces;
7 9
 using Luticate2.Auth.Tests.Business.Fields;
8 10
 using Microsoft.Extensions.DependencyInjection;
9
-using Microsoft.Extensions.DependencyInjection.Extensions;
10 11
 using Xunit;
11 12
 
12 13
 namespace Luticate2.Auth.Tests
@@ -44,131 +45,21 @@ namespace Luticate2.Auth.Tests
44 45
 //            Assert.Equal(2, list.Count);
45 46
 //        }
46 47
 
47
-        protected void AddILuExpressionConverter<TTypeFrom, TTypeTo, TTypeImpl>(IServiceCollection services)
48
-            where TTypeImpl : class, ILuExpressionConverter<TTypeFrom, TTypeTo>
49
-        {
50
-            services.AddSingleton<ILuExpressionConverter<TTypeFrom, TTypeTo>, TTypeImpl>();
51
-            services.TryAddSingleton<ILuExpressionConverter<TTypeFrom>, TTypeImpl>();
52
-        }
53
-
54
-        protected IServiceProvider GetServiceProvider()
55
-        {
56
-            var services = new ServiceCollection();
57
-            services.AddSingleton<LuExpressionConverterEnumerable>();
58
-            AddILuExpressionConverter<TestDbo1, TestModel1, LuDMECTest1>(services);
59
-            AddILuExpressionConverter<TestDbo2, TestModel2, LuDMECTest2>(services);
60
-            AddILuExpressionConverter<LuExpressionConverterStaticMethods, LuExpressionConverterStaticMethods, LuExpressionConverterStaticMethods>(services);
61
-            AddILuExpressionConverter<string, string, LuExpressionConverterIdentity<string>>(services);
62
-            AddILuExpressionConverter<Guid, Guid, LuExpressionConverterIdentity<Guid>>(services);
63
-            AddILuExpressionConverter<bool, bool, LuExpressionConverterIdentity<bool>>(services);
64
-
65
-            var serviceProvider = services.BuildServiceProvider();
66
-            return serviceProvider;
67
-        }
68
-
69
-        [Fact]
70
-        public void Test4()
71
-        {
72
-            Expression<Func<TestDbo2, Guid>> expDbo = (x => x.TestDbo1.Id);
73
-            Expression<Func<TestModel2, Guid>> expModel = (x => x.TestModel1.Id);
74
-            var options = new LuExpressionConverterOptions
75
-            {
76
-                Parameter = Expression.Parameter(typeof(TestModel2), "x")
77
-            };
78
-            var converter = new LuExpressionConverterVisitor(options, GetServiceProvider());
79
-            var result = converter.Visit(expDbo.Body);
80
-            var lamdba = result != null ? Expression.Lambda<Func<TestModel2, Guid>>(result, options.Parameter) : null;
81
-            Assert.Equal(expModel.ToString(), lamdba?.ToString());
82
-        }
83
-
84
-        [Fact]
85
-        public void Test5()
86
-        {
87
-            Expression<Func<TestDbo2, int>> expDbo = (x => 0);
88
-            Expression<Func<TestModel2, int>> expModel = (x => 0);
89
-            var options = new LuExpressionConverterOptions
90
-            {
91
-                Parameter = Expression.Parameter(typeof(TestModel2), "x")
92
-            };
93
-            var converter = new LuExpressionConverterVisitor(options, GetServiceProvider());
94
-            var result = converter.Visit(expDbo.Body);
95
-            var lamdba = result != null ? Expression.Lambda<Func<TestModel2, int>>(result, options.Parameter) : null;
96
-            Assert.Equal(expModel.ToString(), lamdba?.ToString());
97
-        }
98
-
99
-        [Fact]
100
-        public void Test6()
101
-        {
102
-            Expression<Func<TestDbo2, bool>> expDbo = (x => x.Name.Contains("s"));
103
-            Expression<Func<TestModel2, bool>> expModel = (x => x.Name.Contains("s"));
104
-            var options = new LuExpressionConverterOptions
105
-            {
106
-                Parameter = Expression.Parameter(typeof(TestModel2), "x")
107
-            };
108
-            var converter = new LuExpressionConverterVisitor(options, GetServiceProvider());
109
-            var result = converter.Visit(expDbo.Body);
110
-            var lamdba = result != null ? Expression.Lambda<Func<TestModel2, bool>>(result, options.Parameter) : null;
111
-            Assert.Equal(expModel.ToString(), lamdba?.ToString());
112
-        }
113
-
114
-        [Fact]
115
-        public void Test7()
116
-        {
117
-            Expression<Func<TestDbo2, bool>> expDbo = (x => x.TestDbo1.Name.Contains("s"));
118
-            Expression<Func<TestModel2, bool>> expModel = (x => x.TestModel1.Name.Contains("s"));
119
-            var options = new LuExpressionConverterOptions
120
-            {
121
-                Parameter = Expression.Parameter(typeof(TestModel2), "x")
122
-            };
123
-            var converter = new LuExpressionConverterVisitor(options, GetServiceProvider());
124
-            var result = converter.Visit(expDbo.Body);
125
-            var lamdba = result != null ? Expression.Lambda<Func<TestModel2, bool>>(result, options.Parameter) : null;
126
-            Assert.Equal(expModel.ToString(), lamdba?.ToString());
127
-        }
128
-
129
-        [Fact]
130
-        public void Test8()
131
-        {
132
-            Expression<Func<TestDbo2, bool>> expDbo = (x => x.TestDbo1.Name.Contains(x.Name));
133
-            Expression<Func<TestModel2, bool>> expModel = (x => x.TestModel1.Name.Contains(x.Name));
134
-            var options = new LuExpressionConverterOptions
135
-            {
136
-                Parameter = Expression.Parameter(typeof(TestModel2), "x")
137
-            };
138
-            var converter = new LuExpressionConverterVisitor(options, GetServiceProvider());
139
-            var result = converter.Visit(expDbo.Body);
140
-            var lamdba = result != null ? Expression.Lambda<Func<TestModel2, bool>>(result, options.Parameter) : null;
141
-            Assert.Equal(expModel.ToString(), lamdba?.ToString());
142
-        }
48
+//        protected void AddILuExpressionConverter<TTypeFrom, TTypeTo, TTypeImpl>(IServiceCollection services)
49
+//            where TTypeImpl : class, ILuExpressionConverter<TTypeFrom, TTypeTo>
50
+//        {
51
+//            services.AddSingleton<ILuExpressionConverter<TTypeFrom, TTypeTo>, TTypeImpl>();
52
+//            services.TryAddSingleton<ILuExpressionConverter<TTypeFrom>, TTypeImpl>();
53
+//        }
143 54
 
144
-        [Fact]
145
-        public void Test9()
146
-        {
147
-            Expression<Func<TestDbo1, bool>> expDbo = (x => x.TestDbo2s.Any());
148
-            Expression<Func<TestModel1, bool>> expModel = (x => x.TestModel2.Any());
149
-            var options = new LuExpressionConverterOptions
150
-            {
151
-                Parameter = Expression.Parameter(typeof(TestModel1), "x")
152
-            };
153
-            var converter = new LuExpressionConverterVisitor(options, GetServiceProvider());
154
-            var result = converter.Visit(expDbo.Body);
155
-            var lamdba = result != null ? Expression.Lambda<Func<TestModel2, bool>>(result, options.Parameter) : null;
156
-            Assert.Equal(expModel.ToString(), lamdba?.ToString());
157
-        }
55
+//        [Fact]
56
+//        public void Test()
57
+//        {
58
+////            var parentScopeVar = new TestDbo1();
59
+////            Expression<Func<TestDbo2, Guid>> expDbo = (x => parentScopeVar.Id);
60
+////            var type = typeof(ILuObjectConverterDescriptor<,>);
61
+////            var gtype = type.MakeGenericType(typeof(int), typeof(Enumerable));
62
+//        }
158 63
 
159
-        [Fact]
160
-        public void Test10()
161
-        {
162
-            Expression<Func<TestDbo1, bool>> expDbo = (x => x.TestDbo2s.Any(y => y.Name.Contains(x.Name + "s")));
163
-            Expression<Func<TestModel1, bool>> expModel = (x => x.TestModel2.Any(y => y.Name.Contains(x.Name + "s")));
164
-            var options = new LuExpressionConverterOptions
165
-            {
166
-                Parameter = Expression.Parameter(typeof(TestModel1), "x")
167
-            };
168
-            var converter = new LuExpressionConverterVisitor(options, GetServiceProvider());
169
-            var result = converter.Visit(expDbo.Body);
170
-            var lamdba = result != null ? Expression.Lambda<Func<TestModel2, bool>>(result, options.Parameter) : null;
171
-            Assert.Equal(expModel.ToString(), lamdba?.ToString());
172
-        }
173 64
     }
174 65
 }

+ 0
- 36
Luticate2.Auth/Business/Auth/DMEC/LuDMECGroupsToModel.cs 파일 보기

@@ -1,36 +0,0 @@
1
-using System;
2
-using System.Collections.Generic;
3
-using System.Linq.Expressions;
4
-using Luticate2.Auth.Business.Fields;
5
-using Luticate2.Auth.Business.Fields.DMEC;
6
-using Luticate2.Auth.DataAccess.Models;
7
-using Luticate2.Auth.Dbo.Auth;
8
-using Luticate2.Auth.Dbo.Result;
9
-
10
-namespace Luticate2.Auth.Business.Auth.DMEC
11
-{
12
-    public class LuDMECGroupsToModel : LuExpressionConverter<LuGroupDbo, LuGroups>
13
-    {
14
-        public LuDMECGroupsToModel(IServiceProvider serviceProvider) : base(serviceProvider)
15
-        {
16
-        }
17
-
18
-        protected override LuResult<Expression> ConvertInternal(Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
19
-        {
20
-            var expression = expressions.Peek();
21
-            if (expression is MemberExpression memberExpression)
22
-            {
23
-                if (MemberMatch(x => x.Id, memberExpression))
24
-                {
25
-                    return MakeMemberAccess(x => x.Id, expressions, baseExpression, options);
26
-                }
27
-                if (MemberMatch(x => x.Name, memberExpression))
28
-                {
29
-                    return MakeMemberAccess(x => x.Name, expressions, baseExpression, options);
30
-                }
31
-            }
32
-
33
-            return base.ConvertInternal(expressions, baseExpression, options);
34
-        }
35
-    }
36
-}

+ 0
- 2
Luticate2.Auth/Business/Auth/LuGroupsBusiness.cs 파일 보기

@@ -1,14 +1,12 @@
1 1
 using System;
2 2
 using System.Collections.Generic;
3 3
 using System.Linq;
4
-using System.Security.Cryptography.X509Certificates;
5 4
 using Luticate2.Auth.Business.Crud;
6 5
 using Luticate2.Auth.Business.Fields;
7 6
 using Luticate2.Auth.DataAccess;
8 7
 using Luticate2.Auth.DataAccess.Models;
9 8
 using Luticate2.Auth.Dbo.Auth;
10 9
 using Luticate2.Auth.Dbo.Fields;
11
-using Luticate2.Auth.Dbo.Pagination;
12 10
 using Luticate2.Auth.Dbo.Result;
13 11
 using Microsoft.EntityFrameworkCore;
14 12
 

+ 0
- 1
Luticate2.Auth/Business/Auth/PartialObjectCopier/LuPOCGroupsToDbo.cs 파일 보기

@@ -1,5 +1,4 @@
1 1
 using System;
2
-using System.Linq;
3 2
 using Luticate2.Auth.Business.PartialObjectCopier;
4 3
 using Luticate2.Auth.DataAccess.Models;
5 4
 using Luticate2.Auth.Dbo.Auth;

+ 4
- 27
Luticate2.Auth/Business/Crud/LuEfCrudBusiness.cs 파일 보기

@@ -2,8 +2,7 @@
2 2
 using System.Collections.Generic;
3 3
 using System.Linq;
4 4
 using System.Linq.Expressions;
5
-using Luticate2.Auth.Business.Fields;
6
-using Luticate2.Auth.Business.Fields.DMEC;
5
+using Luticate2.Auth.Business.ExpressionConverter;
7 6
 using Luticate2.Auth.Dbo;
8 7
 using Luticate2.Auth.Dbo.Fields;
9 8
 using Luticate2.Auth.Dbo.Pagination;
@@ -81,34 +80,12 @@ namespace Luticate2.Auth.Business.Crud
81 80
 
82 81
             var options = new LuExpressionConverterOptions
83 82
             {
84
-                Parameter = Expression.Parameter(typeof(TModel), "x")
83
+                Parameters = new Dictionary<ParameterExpression, Expression>(), // TODO
84
+                Types = null // TODO
85 85
             };
86 86
             var converter = new LuExpressionConverterVisitor(options, ServiceProvider);
87
-            var result = converter.Visit(lamdbaDbo.Body);
88
-            var lamdbaModel = result != null ? Expression.Lambda<Func<TModel, bool>>(result, options.Parameter) : null;
87
+            var lamdbaModel = converter.Visit(lamdbaDbo) as Expression<Func<TModel, bool>>;// TODO Handle errors
89 88
             return LuResult<IQueryable<TModel>>.Ok(queryable.Where(lamdbaModel));
90
-
91
-//            var converter = ServiceProvider.GetService<ILuExpressionConverter<TDbo, TModel>>();
92
-//            if (converter == null)
93
-//            {
94
-//                return LuResult<IQueryable<TModel>>.Error(LuStatus.InternalError.ToInt(), $"Could not get service: ILuDboModelExpressionConverter<{typeof(TModel).Name}, {typeof(TDbo).Name}>");
95
-//            }
96
-//
97
-//            var lamdba = (Expression<Func<TDbo, bool>>) filter.Expression;
98
-//            var options = new LuDMECOptions
99
-//            {
100
-//                Parameter = Expression.Parameter(typeof(TModel), lamdba.Parameters[0].Name)
101
-//            };
102
-//            var convertResult = converter.ConvertExpression(lamdba.Body, options);
103
-//            if (!convertResult)
104
-//            {
105
-//                return convertResult.To<IQueryable<TModel>>();
106
-//            }
107
-//
108
-//            var lambdaNoConvert = Expression.Lambda<Func<TModel, bool>>(convertResult.Data, options.Parameter);
109
-//
110
-//            return LuResult<IQueryable<TModel>>.Ok(queryable.Where(lambdaNoConvert));
111
-            return LuResult<IQueryable<TModel>>.Ok(queryable);
112 89
         }
113 90
 
114 91
         protected virtual LuResult<IQueryable<TModel>> OrderByField(LuOrderByFieldDbo orderByfield, IQueryable<TModel> queryable)

+ 13
- 0
Luticate2.Auth/Business/ExpressionConverter/LuExpressionConverterOptions.cs 파일 보기

@@ -0,0 +1,13 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq.Expressions;
4
+
5
+namespace Luticate2.Auth.Business.ExpressionConverter
6
+{
7
+    public class LuExpressionConverterOptions
8
+    {
9
+        public IDictionary<ParameterExpression, Expression> Parameters { get; set; }
10
+
11
+        public IDictionary<Type, Type> Types { get; set; }
12
+    }
13
+}

+ 280
- 0
Luticate2.Auth/Business/ExpressionConverter/LuExpressionConverterVisitor.cs 파일 보기

@@ -0,0 +1,280 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq;
4
+using System.Linq.Expressions;
5
+using Luticate2.Auth.Dbo;
6
+using Luticate2.Auth.Dbo.Result;
7
+using Luticate2.Auth.Exceptions;
8
+using Luticate2.Auth.Interfaces;
9
+
10
+namespace Luticate2.Auth.Business.ExpressionConverter
11
+{
12
+    public class LuExpressionConverterVisitor : ExpressionVisitor
13
+    {
14
+        public LuExpressionConverterOptions Options { get; }
15
+
16
+        protected IServiceProvider ServiceProvider { get; }
17
+
18
+        public LuExpressionConverterVisitor(LuExpressionConverterOptions options, IServiceProvider serviceProvider)
19
+        {
20
+            Options = options;
21
+            ServiceProvider = serviceProvider;
22
+        }
23
+
24
+        protected LuResult<Stack<Expression>> StackSimpleExpression(Expression expression, Stack<Expression> stack)
25
+        {
26
+            stack.Push(expression);
27
+            if (expression is MemberExpression memberExpression)
28
+            {
29
+                if (memberExpression.Expression != null)
30
+                {
31
+                    var result = StackSimpleExpression(memberExpression.Expression, stack);
32
+                    return result;
33
+                }
34
+                return LuResult<Stack<Expression>>.Ok(stack);
35
+            }
36
+            else if (expression is MethodCallExpression methodCallExpression)
37
+            {
38
+                if (methodCallExpression.Object != null)
39
+                {
40
+                    var result = StackSimpleExpression(methodCallExpression.Object, stack);
41
+                    return result;
42
+                }
43
+                return LuResult<Stack<Expression>>.Ok(stack);
44
+            }
45
+            else
46
+            {
47
+                return LuResult<Stack<Expression>>.Ok(stack);
48
+            }
49
+        }
50
+
51
+        protected ILuObjectConverterDescriptor GetConverterDescriptor(Type typeFrom, Type typeTo)
52
+        {
53
+            var type = typeof(ILuObjectConverterDescriptor<,>);
54
+            var gtype = type.MakeGenericType(typeFrom, typeTo);
55
+            var descriptor = (ILuObjectConverterDescriptor) ServiceProvider.GetService(gtype);
56
+            if (descriptor == null && typeFrom == typeTo)
57
+            {
58
+                descriptor = (ILuObjectConverterDescriptor) ServiceProvider.GetService(typeof(ILuObjectConverterDescriptorIdentity));
59
+            }
60
+            return descriptor;
61
+        }
62
+
63
+        protected LuResult<Expression> ConvertMemberExpression(MemberExpression memberExpression, Expression newExpression, Type typeTo)
64
+        {
65
+            var typeFrom = memberExpression.Expression == null ? memberExpression.Member.DeclaringType : memberExpression.Expression.Type;
66
+            var descriptor = GetConverterDescriptor(typeFrom, typeTo);
67
+            if (descriptor == null)
68
+            {
69
+                return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
70
+                    $"Could not find converter descriptor for {typeFrom} => {typeTo}");
71
+            }
72
+
73
+            var valueExpression = descriptor.GetMemberValueExpression(memberExpression.Member, Options.Types);
74
+            if (valueExpression == null)
75
+            {
76
+                return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
77
+                    $"Could not find converter descriptor lambda for {typeFrom} => {typeTo} => {memberExpression.Member}");
78
+            }
79
+            if (valueExpression.Parameters[0].Type != typeTo)
80
+            {
81
+                return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
82
+                    $"Invalid conversion lambda for {typeFrom} => {typeTo}");
83
+            }
84
+
85
+            if (newExpression != null)
86
+            {
87
+                Options.Parameters.Add(valueExpression.Parameters[0], newExpression);
88
+            }
89
+
90
+            var visitor = new LuExpressionParamReplaceVisitor(Options);
91
+            var replacedExpression = visitor.Visit(valueExpression.Body);
92
+            newExpression = LuExpressionUtils.GetFromConvert(replacedExpression);
93
+
94
+            if (newExpression != null)
95
+            {
96
+                Options.Parameters.Remove(valueExpression.Parameters[0]);
97
+            }
98
+
99
+            return LuResult<Expression>.Ok(newExpression);
100
+        }
101
+
102
+        protected LuResult<Expression> ConvertMethodCallExpression(MethodCallExpression methodCallExpression, Expression newExpression, Type typeTo)
103
+        {
104
+            var typeFrom = methodCallExpression.Object == null ? methodCallExpression.Method.DeclaringType : methodCallExpression.Object.Type;
105
+            var descriptor = GetConverterDescriptor(typeFrom, typeTo);
106
+            if (descriptor == null)
107
+            {
108
+                return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
109
+                    $"Could not find converter descriptor for {typeFrom} => {typeTo}");
110
+            }
111
+
112
+            var valueExpression = descriptor.GetMethodValueExpression(methodCallExpression.Method, Options.Types);
113
+            if (valueExpression == null)
114
+            {
115
+                return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
116
+                    $"Could not find converter descriptor lambda for {typeFrom} => {typeTo} => {methodCallExpression.Method}");
117
+            }
118
+            if (valueExpression.Parameters.Count != methodCallExpression.Arguments.Count + 1)
119
+            {
120
+                return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
121
+                    $"Converter descriptor lambda has incorrect number of arguments for {typeFrom} => {typeTo} => {methodCallExpression.Method}");
122
+            }
123
+            if (valueExpression.Parameters[0].Type != typeTo)
124
+            {
125
+                return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
126
+                    $"Invalid conversion lambda for {typeFrom} => {typeTo}");
127
+            }
128
+
129
+            var visitorConverter = new LuExpressionConverterVisitor(Options, ServiceProvider);
130
+            for (var i = 0; i < methodCallExpression.Arguments.Count; ++i)
131
+            {
132
+                var convertedArgument = visitorConverter.Visit(methodCallExpression.Arguments[i]);
133
+                Options.Parameters.Add(valueExpression.Parameters[i + 1], convertedArgument);
134
+            }
135
+            Options.Parameters.Add(valueExpression.Parameters[0], newExpression);
136
+            var visitor = new LuExpressionParamReplaceVisitor(Options);
137
+            var replacedExpression = visitor.Visit(valueExpression.Body);
138
+            newExpression = LuExpressionUtils.GetFromConvert(replacedExpression);
139
+            Options.Parameters.Remove(valueExpression.Parameters[0]);
140
+
141
+            return LuResult<Expression>.Ok(newExpression);
142
+        }
143
+
144
+        protected LuResult<Expression> ReplaceExpression(Expression expression)
145
+        {
146
+            var stackResult = StackSimpleExpression(expression, new Stack<Expression>());
147
+            if (!stackResult)
148
+            {
149
+                return stackResult.To<Expression>();
150
+            }
151
+
152
+            Expression newExpression;
153
+            var currentExp = stackResult.Data.Pop();
154
+
155
+            if (currentExp is ParameterExpression parameterExpression)
156
+            {
157
+                if (!Options.Parameters.ContainsKey(parameterExpression))
158
+                {
159
+                    return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
160
+                        $"Could not find a conversion for parameter {parameterExpression}");
161
+                }
162
+                newExpression = Options.Parameters[parameterExpression];
163
+            }
164
+            else if (currentExp is MemberExpression memberExpression)
165
+            {
166
+                var typeFrom = memberExpression.Member.DeclaringType;
167
+                var typeTo = Options.Types.ContainsKey(typeFrom) ? Options.Types[typeFrom] : typeFrom;
168
+
169
+                var convertResult = ConvertMemberExpression(memberExpression, null, typeTo);
170
+                if (!convertResult)
171
+                {
172
+                    return convertResult;
173
+                }
174
+
175
+                newExpression = convertResult.Data;
176
+            }
177
+            else if (currentExp is MethodCallExpression methodCallExpression)
178
+            {
179
+                var typeFrom = methodCallExpression.Method.DeclaringType;
180
+                var typeTo = Options.Types.ContainsKey(typeFrom) ? Options.Types[typeFrom] : typeFrom;
181
+
182
+                var convertResult = ConvertMethodCallExpression(methodCallExpression, null, typeTo);
183
+                if (!convertResult)
184
+                {
185
+                    return convertResult;
186
+                }
187
+
188
+                newExpression = convertResult.Data;
189
+            }
190
+            else
191
+            {
192
+                var visitor = new LuExpressionConverterVisitor(Options, ServiceProvider);
193
+                newExpression = visitor.Visit(currentExp);
194
+            }
195
+
196
+            if (newExpression == null)
197
+            {
198
+                return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
199
+                    $"Invalid simple expression first member: {currentExp}", "");
200
+            }
201
+
202
+            while (stackResult.Data.Any())
203
+            {
204
+                currentExp = stackResult.Data.Pop();
205
+
206
+                if (currentExp is MemberExpression memberExpression)
207
+                {
208
+                    var typeTo = newExpression.Type;
209
+
210
+                    var convertResult = ConvertMemberExpression(memberExpression, newExpression, typeTo);
211
+                    if (!convertResult)
212
+                    {
213
+                        return convertResult;
214
+                    }
215
+
216
+                    newExpression = convertResult.Data;
217
+                }
218
+                else if (currentExp is MethodCallExpression methodCallExpression)
219
+                {
220
+                    var typeTo = newExpression.Type;
221
+
222
+                    var convertResult = ConvertMethodCallExpression(methodCallExpression, newExpression, typeTo);
223
+                    if (!convertResult)
224
+                    {
225
+                        return convertResult;
226
+                    }
227
+
228
+                    newExpression = convertResult.Data;
229
+                }
230
+                else
231
+                {
232
+                    return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
233
+                        $"Unknown expression type (should not happen) {currentExp}");
234
+                }
235
+            }
236
+
237
+            return LuResult<Expression>.Ok(newExpression);
238
+        }
239
+
240
+        protected override Expression VisitMember(MemberExpression node)
241
+        {
242
+            return ReplaceExpression(node).ThrowIfNotSuccess().Data;
243
+        }
244
+
245
+        protected override Expression VisitMethodCall(MethodCallExpression node)
246
+        {
247
+            return ReplaceExpression(node).ThrowIfNotSuccess().Data;
248
+        }
249
+
250
+        protected override Expression VisitParameter(ParameterExpression node)
251
+        {
252
+            if (!Options.Parameters.ContainsKey(node))
253
+            {
254
+                LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
255
+                    $"Could not find a conversion for parameter {node}").Throw();
256
+            }
257
+            return Options.Parameters[node];
258
+        }
259
+
260
+        protected override Expression VisitLambda<T>(Expression<T> node)
261
+        {
262
+            var convertedParams = new List<ParameterExpression>();
263
+            foreach (var parameter in node.Parameters)
264
+            {
265
+                // TODO check Options.Types[parameter.Type] access
266
+                var convertedParam = Expression.Parameter(Options.Types[parameter.Type]);
267
+                Options.Parameters.Add(parameter, convertedParam);
268
+                convertedParams.Add(convertedParam);
269
+            }
270
+            var convertedBody = Visit(node.Body);
271
+            foreach (var parameter in node.Parameters)
272
+            {
273
+                Options.Parameters.Remove(parameter);
274
+            }
275
+
276
+            var convertedLambda = Expression.Lambda(convertedBody, convertedParams);
277
+            return convertedLambda;
278
+        }
279
+    }
280
+}

+ 28
- 0
Luticate2.Auth/Business/ExpressionConverter/LuExpressionParamReplaceVisitor.cs 파일 보기

@@ -0,0 +1,28 @@
1
+using System.Linq.Expressions;
2
+using Luticate2.Auth.Dbo;
3
+using Luticate2.Auth.Dbo.Result;
4
+using Luticate2.Auth.Exceptions;
5
+
6
+namespace Luticate2.Auth.Business.ExpressionConverter
7
+{
8
+    public class LuExpressionParamReplaceVisitor : ExpressionVisitor
9
+    {
10
+        public LuExpressionConverterOptions Options { get; }
11
+
12
+        public LuExpressionParamReplaceVisitor(LuExpressionConverterOptions options)
13
+        {
14
+            Options = options;
15
+        }
16
+
17
+        protected override Expression VisitParameter(ParameterExpression node)
18
+        {
19
+            if (!Options.Parameters.ContainsKey(node))
20
+            {
21
+                LuResult<Expression>.Error(LuStatus.InternalError.ToInt(),
22
+                    $"Could not find a conversion for parameter {node}").Throw();
23
+            }
24
+
25
+            return Options.Parameters[node];
26
+        }
27
+    }
28
+}

+ 0
- 58
Luticate2.Auth/Business/Fields/DMEC/LuExpressionConverterEnumerable.cs 파일 보기

@@ -1,58 +0,0 @@
1
-using System;
2
-using System.Collections.Generic;
3
-using System.Linq;
4
-using System.Linq.Expressions;
5
-using Luticate2.Auth.Dbo;
6
-using Luticate2.Auth.Dbo.Result;
7
-using Luticate2.Auth.Interfaces;
8
-
9
-namespace Luticate2.Auth.Business.Fields.DMEC
10
-{
11
-    public class LuExpressionConverterEnumerable : ILuExpressionConverter
12
-    {
13
-        public IServiceProvider ServiceProvider { get; }
14
-
15
-        public LuExpressionConverterEnumerable(IServiceProvider serviceProvider)
16
-        {
17
-            ServiceProvider = serviceProvider;
18
-        }
19
-
20
-        protected LuResult<Expression> ConvertOther(Type typeFrom, Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
21
-        {
22
-            var type = typeof(ILuExpressionConverter<>);
23
-            var gtype = type.MakeGenericType(typeFrom);
24
-            var converter = (ILuExpressionConverter) ServiceProvider.GetService(gtype);
25
-            if (converter == null)
26
-            {
27
-                return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(), $"Could not get service: {gtype}>");
28
-            }
29
-
30
-            return converter.ConvertExpression(expressions, baseExpression, options);
31
-        }
32
-
33
-        public LuResult<Expression> ConvertExpression(Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
34
-        {
35
-            if (!expressions.Any())
36
-            {
37
-                return LuResult<Expression>.Ok(baseExpression);
38
-            }
39
-
40
-            var expression = expressions.Pop();
41
-            if (expression is MethodCallExpression methodCallExpression)
42
-            {
43
-                var argumentsModel = new List<Expression>();
44
-                foreach (var argumentDbo in methodCallExpression.Arguments)
45
-                {
46
-                    var converter = new LuExpressionConverterVisitor(options, ServiceProvider);
47
-                    var result = converter.Visit(argumentDbo);
48
-                    argumentsModel.Add(result);
49
-                }
50
-
51
-                var newExpression = Expression.Call(baseExpression, methodCallExpression.Method, argumentsModel);
52
-                return ConvertOther(newExpression.Type, expressions, newExpression, options);
53
-            }
54
-
55
-            return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(), "Not supported expression");
56
-        }
57
-    }
58
-}

+ 0
- 38
Luticate2.Auth/Business/Fields/DMEC/LuExpressionConverterIdentity.cs 파일 보기

@@ -1,38 +0,0 @@
1
-using System;
2
-using System.Collections.Generic;
3
-using System.Linq.Expressions;
4
-using Luticate2.Auth.Dbo.Result;
5
-
6
-namespace Luticate2.Auth.Business.Fields.DMEC
7
-{
8
-    public class LuExpressionConverterIdentity<TType> : LuExpressionConverter<TType, TType>
9
-    {
10
-        public LuExpressionConverterIdentity(IServiceProvider serviceProvider) : base(serviceProvider)
11
-        {
12
-        }
13
-
14
-        protected override LuResult<Expression> ConvertInternal(Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
15
-        {
16
-            var expression = expressions.Pop();
17
-            if (expression is MemberExpression memberExpression)
18
-            {
19
-                var newExpression = Expression.MakeMemberAccess(baseExpression, memberExpression.Member);
20
-                return ConvertOther(newExpression.Type, expressions, newExpression, options);
21
-            }
22
-            else if (expression is MethodCallExpression methodCallExpression)
23
-            {
24
-                var argumentsModel = new List<Expression>();
25
-                foreach (var argumentDbo in methodCallExpression.Arguments)
26
-                {
27
-                    var converter = new LuExpressionConverterVisitor(options, ServiceProvider);
28
-                    var result = converter.Visit(argumentDbo);
29
-                    argumentsModel.Add(result);
30
-                }
31
-
32
-                var newExpression = Expression.Call(baseExpression, methodCallExpression.Method, argumentsModel);
33
-                return ConvertOther(newExpression.Type, expressions, newExpression, options);
34
-            }
35
-            return base.ConvertInternal(expressions, baseExpression, options);
36
-        }
37
-    }
38
-}

+ 0
- 9
Luticate2.Auth/Business/Fields/DMEC/LuExpressionConverterOptions.cs 파일 보기

@@ -1,9 +0,0 @@
1
-using System.Linq.Expressions;
2
-
3
-namespace Luticate2.Auth.Business.Fields.DMEC
4
-{
5
-    public class LuExpressionConverterOptions
6
-    {
7
-        public ParameterExpression Parameter { get; set; }
8
-    }
9
-}

+ 0
- 35
Luticate2.Auth/Business/Fields/DMEC/LuExpressionConverterStaticMethods.cs 파일 보기

@@ -1,35 +0,0 @@
1
-using System;
2
-using System.Collections.Generic;
3
-using System.Linq;
4
-using System.Linq.Expressions;
5
-using Luticate2.Auth.Dbo.Result;
6
-using Luticate2.Auth.Interfaces;
7
-
8
-namespace Luticate2.Auth.Business.Fields.DMEC
9
-{
10
-    public class LuExpressionConverterStaticMethods : LuExpressionConverter<LuExpressionConverterStaticMethods, LuExpressionConverterStaticMethods>
11
-    {
12
-        public IDictionary<Type, Type> Converters { get; } = new Dictionary<Type, Type>();
13
-
14
-        public LuExpressionConverterStaticMethods(IServiceProvider serviceProvider) : base(serviceProvider)
15
-        {
16
-            Converters.Add(typeof(Enumerable), typeof(LuExpressionConverterEnumerable));
17
-        }
18
-
19
-        protected override LuResult<Expression> ConvertInternal(Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
20
-        {
21
-            var expression = expressions.Peek();
22
-            if (expression is MethodCallExpression methodCallExpression)
23
-            {
24
-                if (Converters.ContainsKey(methodCallExpression.Method.DeclaringType))
25
-                {
26
-                    var type = Converters[methodCallExpression.Method.DeclaringType];
27
-                    var service = (ILuExpressionConverter) ServiceProvider.GetService(type);
28
-                    return service.ConvertExpression(expressions, baseExpression, options);
29
-                }
30
-            }
31
-
32
-            return base.ConvertInternal(expressions, baseExpression, options);
33
-        }
34
-    }
35
-}

+ 0
- 96
Luticate2.Auth/Business/Fields/LuExpressionConverter.cs 파일 보기

@@ -1,96 +0,0 @@
1
-using System;
2
-using System.Collections;
3
-using System.Collections.Generic;
4
-using System.Linq.Expressions;
5
-using Luticate2.Auth.Business.Fields.DMEC;
6
-using Luticate2.Auth.Dbo;
7
-using Luticate2.Auth.Dbo.Result;
8
-using Luticate2.Auth.Interfaces;
9
-using Microsoft.EntityFrameworkCore.Internal;
10
-
11
-namespace Luticate2.Auth.Business.Fields
12
-{
13
-    public class LuExpressionConverter<TTypeFrom, TTypeTo> : ILuExpressionConverter<TTypeFrom, TTypeTo>
14
-    {
15
-        protected IServiceProvider ServiceProvider { get; }
16
-
17
-        public LuExpressionConverter(IServiceProvider serviceProvider)
18
-        {
19
-            ServiceProvider = serviceProvider;
20
-        }
21
-
22
-        public virtual LuResult<Expression> ConvertExpression(Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
23
-        {
24
-            if (!expressions.Any())
25
-            {
26
-                return LuResult<Expression>.Ok(baseExpression);
27
-            }
28
-
29
-            var expression = expressions.Peek();
30
-            if (expression is ParameterExpression parameterExpression)
31
-            {
32
-                if (parameterExpression.Type != typeof(TTypeFrom))
33
-                {
34
-                    return LuResult<Expression>.Error(LuStatus.InputError.ToInt(), "Bad parameter expression type");
35
-                }
36
-
37
-                expressions.Pop();
38
-                return ConvertExpression(expressions, options.Parameter, options);
39
-            }
40
-            else if (expression is MemberExpression memberExpression)
41
-            {
42
-                if (memberExpression.Member.DeclaringType != typeof(TTypeFrom))
43
-                {
44
-                    return LuResult<Expression>.Error(LuStatus.InputError.ToInt(), "Bad member expression type");
45
-                }
46
-            }
47
-            else if (expression is MethodCallExpression methodCallExpression)
48
-            {
49
-                if (methodCallExpression.Object != null && methodCallExpression.Object.Type != typeof(TTypeFrom))
50
-                {
51
-                    return LuResult<Expression>.Error(LuStatus.InputError.ToInt(), "Bad method call expression type");
52
-                }
53
-            }
54
-
55
-            var convertResult = ConvertInternal(expressions, baseExpression, options);
56
-            return convertResult;
57
-        }
58
-
59
-        protected LuResult<Expression> ConvertOther(Type typeFrom, Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
60
-        {
61
-            var type = typeof(ILuExpressionConverter<>);
62
-            var gtype = type.MakeGenericType(typeFrom);
63
-            var converter = (ILuExpressionConverter) ServiceProvider.GetService(gtype);
64
-            if (converter == null)
65
-            {
66
-                return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(), $"Could not get service: {gtype}>");
67
-            }
68
-
69
-            return converter.ConvertExpression(expressions, baseExpression, options);
70
-        }
71
-
72
-        protected bool MemberMatch<TTypeFromProperty>(Expression<Func<TTypeFrom, TTypeFromProperty>> member, MemberExpression memberExpression)
73
-        {
74
-            return LuExpressionUtils.GetSingleMemberFromExpression(member) == memberExpression.Member;
75
-        }
76
-
77
-        protected LuResult<Expression> MakeMemberAccess<TTypeToProperty>(Expression<Func<TTypeTo, TTypeToProperty>> expression, Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
78
-        {
79
-            var exp = expressions.Pop();
80
-            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression(expression);
81
-            var newExpression = Expression.MakeMemberAccess(baseExpression, memberInfo);
82
-            var convertResult = ConvertOther(exp.Type, expressions, newExpression, options);
83
-            return convertResult;
84
-        }
85
-
86
-//        protected LuResult<Expression> MakeMethodCall<TTypeToProperty>(Expression<Func<TTypeTo, TTypeToProperty>> expression, Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
87
-//        {
88
-//            var exp = expressions.Pop();
89
-//        }
90
-
91
-        protected virtual LuResult<Expression> ConvertInternal(Stack<Expression> expressions, Expression baseExpression, LuExpressionConverterOptions options)
92
-        {
93
-            return LuResult<Expression>.Error(LuStatus.InternalError.ToInt(), "Not supported expression");
94
-        }
95
-    }
96
-}

+ 0
- 88
Luticate2.Auth/Business/Fields/LuExpressionConverterVisitor.cs 파일 보기

@@ -1,88 +0,0 @@
1
-using System;
2
-using System.Collections.Generic;
3
-using System.Linq.Expressions;
4
-using Luticate2.Auth.Business.Fields.DMEC;
5
-using Luticate2.Auth.Dbo;
6
-using Luticate2.Auth.Dbo.Result;
7
-using Luticate2.Auth.Exceptions;
8
-using Luticate2.Auth.Interfaces;
9
-
10
-namespace Luticate2.Auth.Business.Fields
11
-{
12
-    public class LuExpressionConverterVisitor : ExpressionVisitor
13
-    {
14
-        public LuExpressionConverterOptions Options { get; }
15
-
16
-        protected IServiceProvider ServiceProvider { get; }
17
-
18
-        public LuExpressionConverterVisitor(LuExpressionConverterOptions options, IServiceProvider serviceProvider)
19
-        {
20
-            Options = options;
21
-            ServiceProvider = serviceProvider;
22
-        }
23
-
24
-        protected LuResult<Stack<Expression>> StackSimpleExpression(Expression expression, Stack<Expression> stack)
25
-        {
26
-            if (expression is ParameterExpression parameterExpression)
27
-            {
28
-                stack.Push(parameterExpression);
29
-                return LuResult<Stack<Expression>>.Ok(stack);
30
-            }
31
-            else if (expression is MemberExpression memberExpression)
32
-            {
33
-                stack.Push(memberExpression);
34
-                var result = StackSimpleExpression(memberExpression.Expression, stack);
35
-                return result;
36
-            }
37
-            else if (expression is MethodCallExpression methodCallExpression)
38
-            {
39
-                if (methodCallExpression.Object != null)
40
-                {
41
-                    stack.Push(methodCallExpression);
42
-                    var result = StackSimpleExpression(methodCallExpression.Object, stack);
43
-                    return result;
44
-                }
45
-                else
46
-                {
47
-                    stack.Push(methodCallExpression);
48
-                    var param = Expression.Parameter(typeof(LuExpressionConverterStaticMethods));
49
-                    stack.Push(param);
50
-                    return LuResult<Stack<Expression>>.Ok(stack);
51
-                }
52
-            }
53
-
54
-            return LuResult<Stack<Expression>>.Error(LuStatus.InternalError.ToInt(), "Invalid Simple Expression Member");
55
-        }
56
-
57
-        protected Expression ReplaceExpression(Expression expression)
58
-        {
59
-            var stackResult = StackSimpleExpression(expression, new Stack<Expression>()).ThrowIfNotSuccess();
60
-
61
-            var firstResult = stackResult.Data.Peek();
62
-
63
-            var type = typeof(ILuExpressionConverter<>);
64
-            var gtype = type.MakeGenericType(firstResult.Type);
65
-            var converter = (ILuExpressionConverter) ServiceProvider.GetService(gtype);
66
-            if (converter == null)
67
-            {
68
-                LuResult<Expression>.Error(LuStatus.InternalError.ToInt(), $"Could not get service: ILuExpressionConverter<{firstResult.Type.Name}>").Throw();
69
-            }
70
-
71
-            var exp = converter.ConvertExpression(stackResult.Data, null, Options).ThrowIfNotSuccess();
72
-
73
-            return exp.Data;
74
-        }
75
-
76
-        protected override Expression VisitMember(MemberExpression node)
77
-        {
78
-            return ReplaceExpression(node);
79
-        }
80
-
81
-        protected override Expression VisitMethodCall(MethodCallExpression node)
82
-        {
83
-            return ReplaceExpression(node);
84
-        }
85
-
86
-
87
-    }
88
-}

+ 0
- 1
Luticate2.Auth/Business/Fields/LuFieldsExtensions.cs 파일 보기

@@ -4,7 +4,6 @@ using System.Linq;
4 4
 using System.Linq.Expressions;
5 5
 using System.Text.RegularExpressions;
6 6
 using Luticate2.Auth.Dbo.Fields;
7
-using Luticate2.Auth.Dbo.Pagination;
8 7
 
9 8
 namespace Luticate2.Auth.Business.Fields
10 9
 {

+ 29
- 9
Luticate2.Auth/Business/LuExpressionUtils.cs 파일 보기

@@ -10,20 +10,25 @@ namespace Luticate2.Auth.Business
10 10
 {
11 11
     public static class LuExpressionUtils
12 12
     {
13
-        public static Expression GetFromConvert<TType1, TType2>(Expression<Func<TType1, TType2>> exp)
13
+        public static Expression GetFromConvert(Expression exp)
14 14
         {
15
+            Expression e = exp;
16
+            if (exp is LambdaExpression lambdaExpression)
17
+            {
18
+                e = lambdaExpression.Body;
19
+            }
20
+
15 21
             Expression operand;
16
-            if ((exp.Body.NodeType == ExpressionType.Convert ||
17
-                 exp.Body.NodeType == ExpressionType.ConvertChecked)
18
-                && exp.Body is UnaryExpression)
22
+            if ((e.NodeType == ExpressionType.Convert ||
23
+                 e.NodeType == ExpressionType.ConvertChecked)
24
+                && e is UnaryExpression)
19 25
             {
20
-                operand = ((UnaryExpression) exp.Body).Operand;
26
+                operand = ((UnaryExpression) e).Operand;
21 27
             }
22 28
             else
23 29
             {
24
-                operand = exp.Body;
30
+                operand = e;
25 31
             }
26
-
27 32
             return operand;
28 33
         }
29 34
 
@@ -81,17 +86,32 @@ namespace Luticate2.Auth.Business
81 86
             return LuResult<TProperty>.Error(LuStatus.InternalError.ToInt(), "Bad member expression");
82 87
         }
83 88
 
84
-        public static MemberInfo GetSingleMemberFromExpression<TTypeTo, TProperty>(Expression<Func<TTypeTo, TProperty>> property)
89
+        public static MemberInfo GetSingleMemberFromExpression(LambdaExpression property)
85 90
         {
86 91
             var memberExpression = GetFromConvert(property) as MemberExpression;
87 92
 
88
-            if (memberExpression != null && memberExpression.Expression == property.Parameters.First())
93
+            if (memberExpression != null &&
94
+                (memberExpression.Expression == property.Parameters.First() ||
95
+                 (memberExpression.Expression == null && memberExpression.Member.DeclaringType == property.Parameters.First().Type)))
89 96
             {
90 97
                 return memberExpression.Member;
91 98
             }
92 99
             return null;
93 100
         }
94 101
 
102
+        public static MethodInfo GetSingleMethodFromExpression(LambdaExpression method)
103
+        {
104
+            var methodCallExpression = GetFromConvert(method) as MethodCallExpression;
105
+
106
+            // TODO check if something like methodCallExpression.Method.DeclaringType == method.Parameters.First().Type is usefull/required (static/extension methods)
107
+            if (methodCallExpression != null &&
108
+                (methodCallExpression.Object == method.Parameters.First() || methodCallExpression.Object == null))
109
+            {
110
+                return methodCallExpression.Method;
111
+            }
112
+            return null;
113
+        }
114
+
95 115
         private static bool GetMembersFromExpression<TTypeTo, TProperty>(
96 116
             Expression<Func<TTypeTo, TProperty>> property, IList<MemberInfo> memberInfos)
97 117
         {

+ 136
- 0
Luticate2.Auth/Business/ObjectConverter/LuObjectConverterDescriptor.cs 파일 보기

@@ -0,0 +1,136 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq;
4
+using System.Linq.Expressions;
5
+using System.Reflection;
6
+using Luticate2.Auth.Interfaces;
7
+
8
+namespace Luticate2.Auth.Business.ObjectConverter
9
+{
10
+    public class LuObjectConverterDescriptor : ILuObjectConverterDescriptor
11
+    {
12
+        protected enum PropertyType
13
+        {
14
+            Value,
15
+            Object
16
+        }
17
+
18
+        protected class LuObjectConverterDescriptorMemberInfo
19
+        {
20
+            public LambdaExpression ValueExpression { get; set; }
21
+
22
+            public PropertyType PropertyType { get; set; }
23
+        }
24
+
25
+        protected class LuObjectConverterDescriptorMethodInfo
26
+        {
27
+            public LambdaExpression ValueExpression { get; set; }
28
+        }
29
+
30
+        protected delegate LuObjectConverterDescriptorMethodInfo DynamicMethodConverter(MethodInfo methodInfo, IDictionary<Type, Type> types);
31
+
32
+        private IDictionary<MemberInfo, LuObjectConverterDescriptorMemberInfo> StaticMemberConverters { get; } = new Dictionary<MemberInfo, LuObjectConverterDescriptorMemberInfo>();
33
+
34
+        private IDictionary<MethodInfo, LuObjectConverterDescriptorMethodInfo> StaticMethodConverters { get; } = new Dictionary<MethodInfo, LuObjectConverterDescriptorMethodInfo>();
35
+
36
+        private IDictionary<MethodInfo, DynamicMethodConverter> DynamicMethodConverters { get; } = new Dictionary<MethodInfo, DynamicMethodConverter>();
37
+
38
+        protected void AddMemberConverter(LambdaExpression memberFrom, LambdaExpression valueExpression, PropertyType propertyType)
39
+        {
40
+            // TODO: check memberInfo != null
41
+            var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression(memberFrom);
42
+            StaticMemberConverters.Add(memberInfo, new LuObjectConverterDescriptorMemberInfo
43
+            {
44
+                ValueExpression = valueExpression,
45
+                PropertyType = propertyType
46
+            });
47
+        }
48
+
49
+        protected void AddStaticMethodConverter(LambdaExpression methodFrom, LambdaExpression valueExpression)
50
+        {
51
+            // TODO: check methodInfo != null
52
+            var methodInfo = LuExpressionUtils.GetSingleMethodFromExpression(methodFrom);
53
+            StaticMethodConverters.Add(methodInfo, new LuObjectConverterDescriptorMethodInfo
54
+            {
55
+                ValueExpression = valueExpression
56
+            });
57
+        }
58
+
59
+        protected void AddDynamicMethodConverter(LambdaExpression methodFrom, DynamicMethodConverter converter)
60
+        {
61
+            // TODO: check methodInfo != null
62
+            var methodInfo = LuExpressionUtils.GetSingleMethodFromExpression(methodFrom);
63
+            var genericMethodInfo = methodInfo.GetGenericMethodDefinition();
64
+            DynamicMethodConverters.Add(genericMethodInfo, converter);
65
+        }
66
+
67
+        protected void AddDynamicMethodConverterTemplate(LambdaExpression methodFrom)
68
+        {
69
+            AddDynamicMethodConverter(methodFrom,
70
+                (info, types) =>
71
+                {
72
+                    var genericMethodInfo = info.GetGenericMethodDefinition();
73
+                    var templateMethodInfo = genericMethodInfo.MakeGenericMethod(info.GetGenericArguments().Select(x => types[x]).ToArray());
74
+
75
+                    var lambdaParams = new List<ParameterExpression>
76
+                    {
77
+                        Expression.Parameter(templateMethodInfo.DeclaringType) // TODO what if DeclaringType is static class
78
+                    };
79
+                    var methodParams = templateMethodInfo.GetParameters().Select(x => Expression.Parameter(x.ParameterType)).ToList();
80
+                    lambdaParams.AddRange(methodParams);
81
+                    var methodCallExpression = Expression.Call(templateMethodInfo.IsStatic ? null : lambdaParams[0], templateMethodInfo, methodParams);
82
+                    var lambda = Expression.Lambda(methodCallExpression, lambdaParams);
83
+
84
+                    return new LuObjectConverterDescriptorMethodInfo
85
+                    {
86
+                        ValueExpression = lambda
87
+                    };
88
+                }
89
+            );
90
+        }
91
+
92
+        public LambdaExpression GetMemberValueExpression(MemberInfo memberInfo, IDictionary<Type, Type> types)
93
+        {
94
+            if (StaticMemberConverters.ContainsKey(memberInfo))
95
+            {
96
+                return StaticMemberConverters[memberInfo].ValueExpression;
97
+            }
98
+
99
+            return null;
100
+        }
101
+
102
+        public LambdaExpression GetMethodValueExpression(MethodInfo methodInfo, IDictionary<Type, Type> types)
103
+        {
104
+            if (StaticMethodConverters.ContainsKey(methodInfo))
105
+            {
106
+                return StaticMethodConverters[methodInfo].ValueExpression;
107
+            }
108
+
109
+            var genericMethodInfo = methodInfo.GetGenericMethodDefinition();
110
+            if (DynamicMethodConverters.ContainsKey(genericMethodInfo))
111
+            {
112
+                var result = DynamicMethodConverters[genericMethodInfo](methodInfo, types);
113
+                if (result != null)
114
+                {
115
+                    return result.ValueExpression;
116
+                }
117
+            }
118
+
119
+            return null;
120
+        }
121
+    }
122
+
123
+    public class LuObjectConverterDescriptor<TTypeFrom, TTypeTo> : LuObjectConverterDescriptor, ILuObjectConverterDescriptor<TTypeFrom, TTypeTo>
124
+    {
125
+        protected void AddMemberConverter(Expression<Func<TTypeFrom, object>> memberFrom,
126
+            Expression<Func<TTypeTo, object>> valueExpression, PropertyType propertyType)
127
+        {
128
+            AddMemberConverter((LambdaExpression) memberFrom, valueExpression, propertyType);
129
+        }
130
+
131
+        protected void AddNullMemberConverter(Expression<Func<TTypeFrom, object>> memberFrom)
132
+        {
133
+            AddMemberConverter(memberFrom, to => default(TTypeTo), PropertyType.Value);
134
+        }
135
+    }
136
+}

+ 18
- 0
Luticate2.Auth/Business/ObjectConverter/LuObjectConverterDescriptorDbSet.cs 파일 보기

@@ -0,0 +1,18 @@
1
+using System;
2
+using System.Linq;
3
+using System.Linq.Expressions;
4
+using Microsoft.EntityFrameworkCore;
5
+
6
+namespace Luticate2.Auth.Business.ObjectConverter
7
+{
8
+    public class LuObjectConverterDescriptorDbSet : LuObjectConverterDescriptor
9
+    {
10
+        public LuObjectConverterDescriptorDbSet()
11
+        {
12
+            AddDynamicMethodConverterTemplate(
13
+                (Expression<Func<DbSet<object>, Expression<Func<object, bool>>, bool>>)((source, filter) => source.Any(filter)));
14
+            AddDynamicMethodConverterTemplate(
15
+                (Expression<Func<DbSet<object>, Expression<Func<object, bool>>, IQueryable<object>>>)((source, filter) => source.Where(filter)));
16
+        }
17
+    }
18
+}

+ 19
- 0
Luticate2.Auth/Business/ObjectConverter/LuObjectConverterDescriptorEnumerable.cs 파일 보기

@@ -0,0 +1,19 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq;
4
+using System.Linq.Expressions;
5
+using System.Reflection;
6
+using Luticate2.Auth.Interfaces;
7
+
8
+namespace Luticate2.Auth.Business.ObjectConverter
9
+{
10
+    public class LuObjectConverterDescriptorEnumerable : LuObjectConverterDescriptor
11
+    {
12
+        public LuObjectConverterDescriptorEnumerable()
13
+        {
14
+            AddDynamicMethodConverterTemplate((Expression<Func<IEnumerable<object>, bool>>)(source => source.Any()));
15
+            AddDynamicMethodConverterTemplate(
16
+                (Expression<Func<IEnumerable<object>, Func<object, bool>, bool>>)((source, filter) => source.Any(filter)));
17
+        }
18
+    }
19
+}

+ 42
- 0
Luticate2.Auth/Business/ObjectConverter/LuObjectConverterDescriptorIdentity.cs 파일 보기

@@ -0,0 +1,42 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq;
4
+using System.Linq.Expressions;
5
+using System.Reflection;
6
+using Luticate2.Auth.Interfaces;
7
+
8
+namespace Luticate2.Auth.Business.ObjectConverter
9
+{
10
+    public class LuObjectConverterDescriptorIdentity : ILuObjectConverterDescriptorIdentity
11
+    {
12
+        public LambdaExpression GetMemberValueExpression(MemberInfo memberInfo, IDictionary<Type, Type> types)
13
+        {
14
+            var isStatic = false;
15
+            if (memberInfo is FieldInfo fieldInfo)
16
+            {
17
+                isStatic = fieldInfo.IsStatic;
18
+            }
19
+            else if (memberInfo is PropertyInfo propertyInfo)
20
+            {
21
+                isStatic = propertyInfo.GetAccessors(true)[0].IsStatic;
22
+            }
23
+            var param = Expression.Parameter(memberInfo.DeclaringType);
24
+            var memberExpression = Expression.MakeMemberAccess(isStatic ? null : param, memberInfo);
25
+            var lambda = Expression.Lambda(memberExpression, param);
26
+            return lambda;
27
+        }
28
+
29
+        public LambdaExpression GetMethodValueExpression(MethodInfo methodInfo, IDictionary<Type, Type> types)
30
+        {
31
+            var lambdaParams = new List<ParameterExpression>
32
+            {
33
+                Expression.Parameter(methodInfo.DeclaringType) // TODO what if DeclaringType is static class
34
+            };
35
+            var methodParams = methodInfo.GetParameters().Select(x => Expression.Parameter(x.ParameterType)).ToList();
36
+            lambdaParams.AddRange(methodParams);
37
+            var methodCallExpression = Expression.Call(methodInfo.IsStatic ? null : lambdaParams[0], methodInfo, methodParams);
38
+            var lambda = Expression.Lambda(methodCallExpression, lambdaParams);
39
+            return lambda;
40
+        }
41
+    }
42
+}

+ 0
- 1
Luticate2.Auth/DataAccess/Models/LuGroupsObjects.cs 파일 보기

@@ -1,5 +1,4 @@
1 1
 using System;
2
-using System.Collections.Generic;
3 2
 
4 3
 namespace Luticate2.Auth.DataAccess.Models
5 4
 {

+ 0
- 1
Luticate2.Auth/DataAccess/Models/LuUsers.cs 파일 보기

@@ -1,5 +1,4 @@
1 1
 using System;
2
-using System.Collections.Generic;
3 2
 
4 3
 namespace Luticate2.Auth.DataAccess.Models
5 4
 {

+ 0
- 1
Luticate2.Auth/DataAccess/Models/TestTable.cs 파일 보기

@@ -1,5 +1,4 @@
1 1
 using System;
2
-using System.Collections.Generic;
3 2
 
4 3
 namespace Luticate2.Auth.DataAccess.Models
5 4
 {

+ 1
- 3
Luticate2.Auth/DataAccess/Models/luticate2Context.cs 파일 보기

@@ -1,6 +1,4 @@
1
-using System;
2
-using Microsoft.EntityFrameworkCore;
3
-using Microsoft.EntityFrameworkCore.Metadata;
1
+using Microsoft.EntityFrameworkCore;
4 2
 
5 3
 namespace Luticate2.Auth.DataAccess.Models
6 4
 {

+ 1
- 1
Luticate2.Auth/Interfaces/ILuExpressionConverter.cs 파일 보기

@@ -1,6 +1,6 @@
1 1
 using System.Collections.Generic;
2 2
 using System.Linq.Expressions;
3
-using Luticate2.Auth.Business.Fields.DMEC;
3
+using Luticate2.Auth.Business.ExpressionConverter;
4 4
 using Luticate2.Auth.Dbo.Result;
5 5
 
6 6
 namespace Luticate2.Auth.Interfaces

+ 22
- 0
Luticate2.Auth/Interfaces/ILuObjectConverterDescriptor.cs 파일 보기

@@ -0,0 +1,22 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq.Expressions;
4
+using System.Reflection;
5
+
6
+namespace Luticate2.Auth.Interfaces
7
+{
8
+    public interface ILuObjectConverterDescriptor
9
+    {
10
+        LambdaExpression GetMemberValueExpression(MemberInfo memberInfo, IDictionary<Type, Type> types);
11
+
12
+        LambdaExpression GetMethodValueExpression(MethodInfo methodInfo, IDictionary<Type, Type> types);
13
+    }
14
+
15
+    public interface ILuObjectConverterDescriptor<TTypeFrom, TTypeTo> : ILuObjectConverterDescriptor
16
+    {
17
+    }
18
+
19
+    public interface ILuObjectConverterDescriptorIdentity : ILuObjectConverterDescriptor
20
+    {
21
+    }
22
+}

Loading…
취소
저장