发布x.4.2.8 修复[#135]

This commit is contained in:
xuejiaming 2022-04-14 14:17:24 +08:00
parent 29de264787
commit e7474d1526
3 changed files with 90 additions and 53 deletions

View File

@ -1,9 +1,9 @@
:start
::定义版本
set EFCORE2=2.4.2.07
set EFCORE3=3.4.2.07
set EFCORE5=5.4.2.07
set EFCORE6=6.4.2.07
set EFCORE2=2.4.2.08
set EFCORE3=3.4.2.08
set EFCORE5=5.4.2.08
set EFCORE6=6.4.2.08
::删除所有bin与obj下的文件
@echo off

View File

@ -59,60 +59,78 @@ namespace ShardingCore.Core.Internal.Visitors
}
protected override Expression VisitNew(NewExpression node)
{
//select 对象的数据和参数必须一致
if (node.Members.Count != node.Arguments.Count)
throw new ShardingCoreInvalidOperationException("cant parse select members length not eq arguments length");
for (int i = 0; i < node.Members.Count; i++)
if (node.Members == null)
{
var declaringType = node.Members[i].DeclaringType;
var memberName = node.Members[i].Name;
var propertyInfo = declaringType.GetProperty(memberName);
if (node.Arguments[i] is MethodCallExpression methodCallExpression)
for (int i = 0; i < node.Arguments.Count; i++)
{
var method = methodCallExpression.Method;
if (method.Name == nameof(Queryable.Count) || method.Name == nameof(Queryable.Sum) || method.Name == nameof(Queryable.Max) || method.Name == nameof(Queryable.Min) || method.Name == nameof(Queryable.Average))
var arg = node.Arguments[i];
if (arg is MemberExpression memberExpression)
{
SelectOwnerProperty selectOwnerProperty = null;
if (method.Name == nameof(Queryable.Average))
{
var fromProperty = GetAggregateFromProperty(methodCallExpression);
selectOwnerProperty = new SelectAverageProperty(declaringType,
propertyInfo, fromProperty, true, method.Name);
}
else if (method.Name == nameof(Queryable.Count))
{
selectOwnerProperty = new SelectCountProperty(declaringType,
propertyInfo, true, method.Name);
}
else if (method.Name == nameof(Queryable.Sum))
{
var fromProperty = GetAggregateFromProperty(methodCallExpression);
selectOwnerProperty = new SelectSumProperty(declaringType,
propertyInfo, fromProperty, true, method.Name);
}
else if (method.Name == nameof(Queryable.Max))
{
selectOwnerProperty = new SelectMaxProperty(declaringType,
propertyInfo, true, method.Name);
}
else if (method.Name == nameof(Queryable.Min))
{
selectOwnerProperty = new SelectMinProperty(declaringType,
propertyInfo, true, method.Name);
}
else
{
selectOwnerProperty = new SelectAggregateProperty(declaringType,
propertyInfo,
true, method.Name);
}
_selectContext.SelectProperties.Add(selectOwnerProperty);
continue;
var declaringType = memberExpression.Member.DeclaringType;
var memberName = memberExpression.Member.Name;
var propertyInfo = declaringType.GetProperty(memberName);
_selectContext.SelectProperties.Add(new SelectOwnerProperty(declaringType,
propertyInfo));
}
}
_selectContext.SelectProperties.Add(new SelectOwnerProperty(declaringType,
propertyInfo));
}
else
{
//select 对象的数据和参数必须一致
if (node.Members.Count != node.Arguments.Count)
throw new ShardingCoreInvalidOperationException("cant parse select members length not eq arguments length");
for (int i = 0; i < node.Members.Count; i++)
{
var declaringType = node.Members[i].DeclaringType;
var memberName = node.Members[i].Name;
var propertyInfo = declaringType.GetProperty(memberName);
if (node.Arguments[i] is MethodCallExpression methodCallExpression)
{
var method = methodCallExpression.Method;
if (method.Name == nameof(Queryable.Count) || method.Name == nameof(Queryable.Sum) || method.Name == nameof(Queryable.Max) || method.Name == nameof(Queryable.Min) || method.Name == nameof(Queryable.Average))
{
SelectOwnerProperty selectOwnerProperty = null;
if (method.Name == nameof(Queryable.Average))
{
var fromProperty = GetAggregateFromProperty(methodCallExpression);
selectOwnerProperty = new SelectAverageProperty(declaringType,
propertyInfo, fromProperty, true, method.Name);
}
else if (method.Name == nameof(Queryable.Count))
{
selectOwnerProperty = new SelectCountProperty(declaringType,
propertyInfo, true, method.Name);
}
else if (method.Name == nameof(Queryable.Sum))
{
var fromProperty = GetAggregateFromProperty(methodCallExpression);
selectOwnerProperty = new SelectSumProperty(declaringType,
propertyInfo, fromProperty, true, method.Name);
}
else if (method.Name == nameof(Queryable.Max))
{
selectOwnerProperty = new SelectMaxProperty(declaringType,
propertyInfo, true, method.Name);
}
else if (method.Name == nameof(Queryable.Min))
{
selectOwnerProperty = new SelectMinProperty(declaringType,
propertyInfo, true, method.Name);
}
else
{
selectOwnerProperty = new SelectAggregateProperty(declaringType,
propertyInfo,
true, method.Name);
}
_selectContext.SelectProperties.Add(selectOwnerProperty);
continue;
}
}
_selectContext.SelectProperties.Add(new SelectOwnerProperty(declaringType,
propertyInfo));
}
}
return base.VisitNew(node);
}

View File

@ -613,8 +613,26 @@ namespace ShardingCore.Test
var sysUserMod = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Name == "name_2").FirstOrDefaultAsync();
Assert.NotNull(sysUserMod);
Assert.Equal("2", sysUserMod.Id);
var sysUserMod2 = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Name == "name_2").Select(o => new
{
Name=o.Name
}).FirstOrDefaultAsync();
var sysUserMod1 = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Name == "name_2").Select(o => new TestClass(o.Name,""){Id = o.Id}).FirstOrDefaultAsync();
Assert.NotNull(sysUserMod1);
}
public class TestClass
{
public string Name { get; }
public string Aa { get; }
public string Id { get; set; }
public TestClass(string name,string aa)
{
Name = name;
Aa = aa;
}
}
[Fact]
public async Task FirstOrDefault4()
@ -631,6 +649,7 @@ namespace ShardingCore.Test
Assert.Null(sysUserMod);
}
[Fact]
public async Task Count_Test()
{