- 修复 AsTable 分表 ToAggregate 无法得到汇总;#1115

This commit is contained in:
2881099 2022-05-24 14:04:18 +08:00
parent 792ffd4e07
commit 5a9c92bc54
3 changed files with 82 additions and 19 deletions

View File

@ -110,6 +110,7 @@ namespace base_entity
public Guid id { get; set; } public Guid id { get; set; }
public string msg { get; set; } public string msg { get; set; }
public DateTime createtime { get; set; } public DateTime createtime { get; set; }
public int click { get; set; }
} }
public class SomeEntity public class SomeEntity
@ -503,14 +504,14 @@ namespace base_entity
var testitems = new[] var testitems = new[]
{ {
new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11") }, new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11"), click = 1 },
new AsTableLog{ msg = "msg02", createtime = DateTime.Parse("2022-1-2 14:00:12") }, new AsTableLog{ msg = "msg02", createtime = DateTime.Parse("2022-1-2 14:00:12"), click = 2 },
new AsTableLog{ msg = "msg03", createtime = DateTime.Parse("2022-2-2 15:00:13") }, new AsTableLog{ msg = "msg03", createtime = DateTime.Parse("2022-2-2 15:00:13"), click = 3 },
new AsTableLog{ msg = "msg04", createtime = DateTime.Parse("2022-2-8 15:00:13") }, new AsTableLog{ msg = "msg04", createtime = DateTime.Parse("2022-2-8 15:00:13"), click = 4 },
new AsTableLog{ msg = "msg05", createtime = DateTime.Parse("2022-3-8 15:00:13") }, new AsTableLog{ msg = "msg05", createtime = DateTime.Parse("2022-3-8 15:00:13"), click = 5 },
new AsTableLog{ msg = "msg06", createtime = DateTime.Parse("2022-4-8 15:00:13") }, new AsTableLog{ msg = "msg06", createtime = DateTime.Parse("2022-4-8 15:00:13"), click = 6 },
new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-6-8 15:00:13") }, new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-6-8 15:00:13"), click = 7 },
new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-7-1") } new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-7-1"), click = 8}
}; };
var sqlatb = fsql.Insert(testitems).NoneParameter(); var sqlatb = fsql.Insert(testitems).NoneParameter();
var sqlat = sqlatb.ToSql(); var sqlat = sqlatb.ToSql();
@ -596,6 +597,15 @@ namespace base_entity
var sqls601 = sqls6.ToSql(); var sqls601 = sqls6.ToSql();
var sqls602 = sqls6.ToList(); var sqls602 = sqls6.ToList();
var sqls7 = fsql.Select<AsTableLog>().Where(a => a.createtime < DateTime.Parse("2022-5-1")).ToAggregate(g => new
{
sum1 = g.Sum(g.Key.click),
cou1 = g.Count(),
avg1 = g.Avg(g.Key.click),
min = g.Min(g.Key.click),
max = g.Max(g.Key.click)
});
fsql.Aop.AuditValue += new EventHandler<FreeSql.Aop.AuditValueEventArgs>((_, e) => fsql.Aop.AuditValue += new EventHandler<FreeSql.Aop.AuditValueEventArgs>((_, e) =>
{ {

View File

@ -786,14 +786,5 @@
<param name="that"></param> <param name="that"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
<summary>
批量注入 Repository可以参考代码自行调整
</summary>
<param name="services"></param>
<param name="globalDataFilter"></param>
<param name="assemblies"></param>
<returns></returns>
</member>
</members> </members>
</doc> </doc>

View File

@ -1084,7 +1084,38 @@ namespace FreeSql.Internal.CommonProvider
var index = 0; var index = 0;
_commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, null, _whereGlobalFilter, null, null, false); //不走 DTO 映射,不处理 IncludeMany _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, null, _whereGlobalFilter, null, null, false); //不走 DTO 映射,不处理 IncludeMany
return this.ToListMapReader<TReturn>(new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null)).FirstOrDefault(); var af = new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null);
if (GetTableRuleUnions().Count <= 1) return this.ToListMapReader<TReturn>(af).FirstOrDefault();
var affield = af.field;
var allMemExps = new FindAllMemberExpressionVisitor(this);
allMemExps.Visit(select);
field.Clear();
var fieldAlias = new Dictionary<string, bool>();
var fieldReplaced = new Dictionary<string, bool>();
foreach (var memExp in allMemExps.Result)
{
var gef = GetExpressionField(memExp.Item1, FieldAliasOptions.AsProperty);
var geffield = gef.field;
if (fieldReplaced.ContainsKey(geffield)) continue;
fieldReplaced.Add(geffield, true);
field.Append(", ").Append(gef.field);
if (fieldAlias.ContainsKey(memExp.Item2.Attribute.Name))
{
field.Append(_commonUtils.FieldAsAlias($"aas{fieldAlias.Count}"));
affield = affield.Replace(geffield, $"ftba.aas{fieldAlias.Count}");
}
else
{
fieldAlias.Add(memExp.Item2.Attribute.Name, true);
affield = affield.Replace(geffield, $"ftba.{string.Join(".", geffield.Split('.').Skip(1))}");
}
}
var sql = this.ToSql(field.Remove(0, 2).ToString());
sql = $"{_select} {affield} FROM ( \r\n {sql.Replace("\r\n", "\r\n ")}\r\n) ftba";
return ToListMrPrivate<TReturn>(sql, af, null).FirstOrDefault();
} }
finally finally
{ {
@ -1543,7 +1574,38 @@ namespace FreeSql.Internal.CommonProvider
var index = 0; var index = 0;
_commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, null, _whereGlobalFilter, null, null, false); //不走 DTO 映射,不处理 IncludeMany _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, null, _whereGlobalFilter, null, null, false); //不走 DTO 映射,不处理 IncludeMany
return (await this.ToListMapReaderAsync<TReturn>(new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null), cancellationToken)).FirstOrDefault(); var af = new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null);
if (GetTableRuleUnions().Count <= 1) return (await this.ToListMapReaderAsync<TReturn>(af, cancellationToken)).FirstOrDefault();
var affield = af.field;
var allMemExps = new FindAllMemberExpressionVisitor(this);
allMemExps.Visit(select);
field.Clear();
var fieldAlias = new Dictionary<string, bool>();
var fieldReplaced = new Dictionary<string, bool>();
foreach (var memExp in allMemExps.Result)
{
var gef = GetExpressionField(memExp.Item1, FieldAliasOptions.AsProperty);
var geffield = gef.field;
if (fieldReplaced.ContainsKey(geffield)) continue;
fieldReplaced.Add(geffield, true);
field.Append(", ").Append(gef.field);
if (fieldAlias.ContainsKey(memExp.Item2.Attribute.Name))
{
field.Append(_commonUtils.FieldAsAlias($"aas{fieldAlias.Count}"));
affield = affield.Replace(geffield, $"ftba.aas{fieldAlias.Count}");
}
else
{
fieldAlias.Add(memExp.Item2.Attribute.Name, true);
affield = affield.Replace(geffield, $"ftba.{string.Join(".", geffield.Split('.').Skip(1))}");
}
}
var sql = this.ToSql(field.Remove(0, 2).ToString());
sql = $"{_select} {affield} FROM ( \r\n {sql.Replace("\r\n", "\r\n ")}\r\n) ftba";
return (await ToListMrPrivateAsync<TReturn>(sql, af, null, cancellationToken)).FirstOrDefault();
} }
finally finally
{ {