Skip to content

Commit 269d1aa

Browse files
committed
修复group by下的匿名和member init的绑定 发布x.6.0.35
1 parent a33de93 commit 269d1aa

File tree

5 files changed

+87
-12
lines changed

5 files changed

+87
-12
lines changed

samples/Sample.MySql/Controllers/WeatherForecastController.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ public class ssss
1515
public string Id { get; set; }
1616
public int C { get; set; }
1717
}
18+
19+
public class abc
20+
{
21+
public string id { get; set; }
22+
public string name { get; set; }
23+
public int count { get; set; }
24+
}
1825
[ApiController]
1926
[Route("[controller]/[action]")]
2027
public class WeatherForecastController : ControllerBase
@@ -58,6 +65,24 @@ public async Task<IActionResult> Get()
5865
// Console.WriteLine("------------");
5966
// using (var tran = _defaultTableDbContext.Database.BeginTransaction())
6067
// {
68+
var resultX1 = await _defaultTableDbContext.Set<SysUserMod>()
69+
.Where(o => o.Id == "2" || o.Id == "3").GroupBy(o => new { o.Id,o.Name })
70+
.Select(o => new
71+
{
72+
id = o.Key.Id,
73+
name = o.Key.Name,
74+
count = o.Count()
75+
}).ToListAsync();
76+
var resultX12 = await _defaultTableDbContext.Set<SysUserMod>()
77+
.Where(o => o.Id == "2" || o.Id == "3").GroupBy(o => new { o.Id,o.Name })
78+
.Select(o => new abc
79+
{
80+
id = o.Key.Id,
81+
name = o.Key.Name,
82+
count = o.Count()
83+
}).ToListAsync();
84+
85+
6186
var firstOrDefault = _defaultTableDbContext.Set<SysUserMod>().FromSqlRaw($"select * from {nameof(SysUserMod)}").FirstOrDefault();
6287

6388
var sysUserMods1 = _defaultTableDbContext.Set<SysTest>()

src/ShardingCore/Extensions/ExpressionExtension.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,17 @@ public static void SetPropertyValue<T>(this T t, string name, object value)
2525
throw new Exception($"type:{typeof(T)} not found [{name}] properity ");
2626
}
2727

28-
var param_obj = Expression.Parameter(type);
29-
var param_val = Expression.Parameter(typeof(object));
30-
var body_obj = Expression.Convert(param_obj, type);
31-
var body_val = Expression.Convert(param_val, p.PropertyType);
3228

3329
//获取设置属性的值的方法
3430
var setMethod = p.GetSetMethod(true);
3531

3632
//如果只是只读,则setMethod==null
3733
if (setMethod != null)
3834
{
35+
var param_obj = Expression.Parameter(type);
36+
var param_val = Expression.Parameter(typeof(object));
37+
var body_obj = Expression.Convert(param_obj, type);
38+
var body_val = Expression.Convert(param_val, p.PropertyType);
3939
var body = Expression.Call(param_obj, p.GetSetMethod(), body_val);
4040
var setValue = Expression.Lambda<Action<T, object>>(body, param_obj, param_val).Compile();
4141
setValue(t, value);

src/ShardingCore/Extensions/TypeExtension.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using System.Reflection;
5+
using System.Runtime.CompilerServices;
46
using System.Text;
57
using System.Threading.Tasks;
68

@@ -87,5 +89,16 @@ public static bool IsBooleanType(Type type)
8789

8890
return Type.GetTypeCode(type) == TypeCode.Boolean;
8991
}
92+
public static bool IsAnonymousType(this Type type)
93+
{
94+
if (type == null)
95+
throw new ArgumentNullException(nameof(type));
96+
97+
// HACK: The only way to detect anonymous types right now.
98+
return Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false)
99+
&& type.IsGenericType && type.Name.Contains("AnonymousType")
100+
&& (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$"))
101+
&& type.Attributes.HasFlag(TypeAttributes.NotPublic);
102+
}
90103
}
91104
}

src/ShardingCore/Sharding/Enumerators/AggregateExtensions/AggregateExtension.cs

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,36 @@ public static TSource CopyTSource<TSource>(TSource source)
2525
var anonType = source.GetType();
2626
var allProperties = anonType.GetProperties();
2727
var allPropertyTypes= allProperties.Select(o=>o.PropertyType).ToArray();
28-
var constantExpressions = allProperties.Select(o => Expression.Constant(o.GetValue(source))).ToArray();
29-
30-
var exp = Expression.New(
31-
anonType.GetConstructor(allPropertyTypes),
32-
constantExpressions);
33-
var lambda = LambdaExpression.Lambda(exp);
34-
TSource myObj = (TSource)lambda.Compile().DynamicInvoke();
35-
return myObj;
28+
if (anonType.IsAnonymousType())
29+
{
30+
var constantExpressions = allProperties.Select(o => Expression.Constant(o.GetValue(source))).ToArray();
31+
var exp = Expression.New(
32+
anonType.GetConstructor(allPropertyTypes),
33+
constantExpressions);
34+
var lambda = LambdaExpression.Lambda(exp);
35+
TSource myObj = (TSource)lambda.Compile().DynamicInvoke();
36+
return myObj;
37+
}
38+
else
39+
{
40+
var parameters = allProperties.Select(o => o.GetValue(source)).ToArray();
41+
if (anonType.GetConstructors().Length == 1 &&
42+
anonType.GetConstructors()[0].GetParameters().Length == allPropertyTypes.Length)
43+
{
44+
return (TSource)Activator.CreateInstance(anonType, parameters);
45+
}
46+
else
47+
{
48+
var instance = (TSource)Activator.CreateInstance(anonType);
49+
foreach (var property in allProperties)
50+
{
51+
var value = property.GetValue(source);
52+
instance.SetPropertyValue(property.Name,value);
53+
}
54+
55+
return instance;
56+
}
57+
}
3658

3759
}
3860
[ExcludeFromCodeCoverage]

src/ShardingCore/Sharding/Visitors/QueryableExtraDiscoverVisitor.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,21 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
125125
var propertyInfo = declaringType.GetProperty(memberName);
126126
_selectContext.SelectProperties.Add(new SelectOwnerProperty(declaringType, propertyInfo));
127127
//memberExpression.Acc
128+
}else if (expression is MemberInitExpression memberInitExpression)
129+
{
130+
foreach (var memberBinding in memberInitExpression.Bindings)
131+
{
132+
if (memberBinding is MemberAssignment memberAssignment)
133+
{
134+
if (memberAssignment.Expression is MemberExpression bindMemberExpression)
135+
{
136+
var declaringType = memberBinding.Member.DeclaringType;
137+
var memberName = memberBinding.Member.Name;
138+
var propertyInfo = declaringType.GetProperty(memberName);
139+
_selectContext.SelectProperties.Add(new SelectOwnerProperty(declaringType, propertyInfo));
140+
}
141+
}
142+
}
128143
}
129144
//if (expression != null)
130145
//{

0 commit comments

Comments
 (0)