Skip to content

Commit 62c666b

Browse files
DocSvartzDocSvartz
authored andcommitted
refactoring
1 parent 0b0c252 commit 62c666b

File tree

5 files changed

+66
-112
lines changed

5 files changed

+66
-112
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using System.Collections.Generic;
2+
using System.Linq.Expressions;
3+
4+
namespace Mapster.Utils
5+
{
6+
public sealed class TopLevelMemberNameVisitor : ExpressionVisitor
7+
{
8+
public string? MemeberName { get; private set; }
9+
10+
public override Expression Visit(Expression node)
11+
{
12+
if (node == null)
13+
return null;
14+
switch (node.NodeType)
15+
{
16+
case ExpressionType.MemberAccess:
17+
{
18+
if (string.IsNullOrEmpty(MemeberName))
19+
MemeberName = ((MemberExpression)node).Member.Name;
20+
21+
return base.Visit(node);
22+
}
23+
}
24+
25+
return base.Visit(node);
26+
}
27+
}
28+
29+
public sealed class QuoteVisiter : ExpressionVisitor
30+
{
31+
public List<UnaryExpression> Quotes { get; private set; } = new();
32+
33+
public override Expression Visit(Expression node)
34+
{
35+
if (node == null)
36+
return null;
37+
switch (node.NodeType)
38+
{
39+
case ExpressionType.Quote:
40+
{
41+
Quotes.Add((UnaryExpression)node);
42+
return base.Visit(node);
43+
}
44+
}
45+
46+
return base.Visit(node);
47+
}
48+
}
49+
}

src/Mapster.Core/Utils/TopLevelMemeberNameVisiter.cs

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 12 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
using Mapster.Enums;
22
using Mapster.Models;
3+
using Mapster.Utils;
34
using System.Collections.Generic;
45
using System.Diagnostics.CodeAnalysis;
56
using System.Linq;
67
using System.Linq.Expressions;
7-
using Mapster;
88

99
namespace Mapster.EFCore
1010
{
@@ -13,9 +13,7 @@ public static class EFCoreExtensions
1313
public static IQueryable<TDestination> EFCoreProjectToType<TDestination>(this IQueryable source,
1414
TypeAdapterConfig? config = null, ProjectToTypeAutoMapping autoMapConfig = ProjectToTypeAutoMapping.WithoutCollections)
1515
{
16-
17-
var allInclude = new IncludeVisiter();
18-
16+
var allInclude = new IncludeVisitor();
1917
allInclude.Visit(source.Expression);
2018

2119
if (config == null)
@@ -27,13 +25,9 @@ public static IQueryable<TDestination> EFCoreProjectToType<TDestination>(this IQ
2725

2826
var mapTuple = new TypeTuple(source.ElementType, typeof(TDestination));
2927

30-
3128
TypeAdapterRule rule;
32-
3329
config.RuleMap.TryGetValue(mapTuple, out rule);
3430

35-
36-
3731
if(rule != null)
3832
{
3933
rule.Settings.ProjectToTypeMapConfig = autoMapConfig;
@@ -48,113 +42,55 @@ public static IQueryable<TDestination> EFCoreProjectToType<TDestination>(this IQ
4842
}
4943
else
5044
rule.Settings.ProjectToTypeResolvers.TryAdd(item.Key, item.Value);
51-
52-
5345
}
54-
5546
}
56-
57-
5847
}
5948
else
6049
{
6150
config = config.Clone()
6251
.ForType(source.ElementType, typeof(TDestination))
6352
.Config;
6453
}
65-
66-
54+
6755
return source.ProjectToType<TDestination>(config);
68-
6956
}
70-
7157
}
7258

73-
internal class IncludeVisiter : ExpressionVisitor
59+
60+
internal class IncludeVisitor : ExpressionVisitor
7461
{
62+
public Dictionary<string, UnaryExpression> IncludeExpression { get; protected set; } = new();
63+
private bool IsInclude(Expression node) => node.Type.Name.StartsWith("IIncludableQueryable");
64+
7565
[return: NotNullIfNotNull("node")]
7666
public override Expression Visit(Expression node)
7767
{
7868
if (node == null)
7969
return null;
70+
8071
switch (node.NodeType)
8172
{
8273
case ExpressionType.Call:
8374
{
84-
if(IsInclude(node))
75+
if (IsInclude(node))
8576
{
8677
var QuoteVisiter = new QuoteVisiter();
8778
QuoteVisiter.Visit(node);
8879

8980
foreach (var item in QuoteVisiter.Quotes)
9081
{
91-
var memberv = new TopLevelMemeberNameVisiter();
82+
var memberv = new TopLevelMemberNameVisitor();
9283
memberv.Visit(item);
9384

94-
IncludeExpression.TryAdd(memberv.Key, item);
95-
85+
IncludeExpression.TryAdd(memberv.MemeberName, item);
9686
}
97-
98-
9987
}
10088
return base.Visit(node);
10189
}
10290
}
10391

10492
return base.Visit(node);
10593
}
106-
107-
public Dictionary<string,UnaryExpression> IncludeExpression { get; protected set; } = new();
108-
private bool IsInclude (Expression node) => node.Type.Name.StartsWith("IIncludableQueryable");
109-
11094
}
11195

112-
internal class QuoteVisiter: ExpressionVisitor
113-
{
114-
public List<UnaryExpression> Quotes { get; private set; } = new();
115-
116-
public override Expression Visit(Expression node)
117-
{
118-
if (node == null)
119-
return null;
120-
switch (node.NodeType)
121-
{
122-
case ExpressionType.Quote:
123-
{
124-
Quotes.Add((UnaryExpression)node);
125-
return base.Visit(node);
126-
}
127-
}
128-
129-
return base.Visit(node);
130-
131-
}
132-
}
133-
134-
internal class TopLevelMemeberNameVisiter: ExpressionVisitor
135-
{
136-
public string? Key { get; private set; }
137-
138-
public override Expression Visit(Expression node)
139-
{
140-
141-
142-
if (node == null)
143-
return null;
144-
switch (node.NodeType)
145-
{
146-
case ExpressionType.MemberAccess:
147-
{
148-
if (string.IsNullOrEmpty(Key))
149-
Key = ((MemberExpression)node).Member.Name;
150-
151-
return base.Visit(node);
152-
}
153-
}
154-
155-
return base.Visit(node);
156-
157-
158-
}
159-
}
16096
}

src/Mapster/Adapters/BaseClassAdapter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ select fn(src, destinationMember, arg))
4747

4848
s.Visit(getter);
4949

50-
var match = arg.Settings.ProjectToTypeResolvers.GetValueOrDefault(s.Key);
50+
var match = arg.Settings.ProjectToTypeResolvers.GetValueOrDefault(s.MemeberName);
5151

5252
if (match != null)
5353
{

src/Mapster/Adapters/DictionaryAdapter.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ protected override Expression CreateBlockExpression(Expression source, Expressio
8686
var kvpType = source.Type.ExtractCollectionType();
8787
var kvp = Expression.Variable(kvpType, "kvp");
8888
var key = Expression.Variable(keyType, "key");
89-
var keyAssign = Expression.Assign(key, Expression.Property(kvp, "Key"));
89+
var keyAssign = Expression.Assign(key, Expression.Property(kvp, "MemeberName"));
9090

91-
//dest[kvp.Key] = convert(kvp.Value);
91+
//dest[kvp.MemeberName] = convert(kvp.Value);
9292
var set = CreateSetFromKvp(kvp, key, dict, arg);
9393
if (arg.Settings.NameMatchingStrategy.SourceMemberNameConverter != MapsterHelper.Identity)
9494
{
@@ -140,7 +140,7 @@ protected override Expression CreateBlockExpression(Expression source, Expressio
140140
}
141141

142142
//if (kvp.Value != null)
143-
// dest[kvp.Key] = convert(kvp.Value);
143+
// dest[kvp.MemeberName] = convert(kvp.Value);
144144
var kvpValueType = kvpType.GetGenericArguments()[1];
145145
if (arg.Settings.IgnoreNullValues == true && kvpValueType.CanBeNull())
146146
{
@@ -152,7 +152,7 @@ protected override Expression CreateBlockExpression(Expression source, Expressio
152152
}
153153

154154
//foreach (var kvp in source) {
155-
// dest[kvp.Key] = convert(kvp.Value);
155+
// dest[kvp.MemeberName] = convert(kvp.Value);
156156
//}
157157
set = Expression.Block(new[] { key }, keyAssign, set);
158158
var loop = ExpressionEx.ForEach(source, kvp, set);

0 commit comments

Comments
 (0)