Skip to content

Commit 5a9c92b

Browse files
committed
- 修复 AsTable 分表 ToAggregate 无法得到汇总;#1115
1 parent 792ffd4 commit 5a9c92b

File tree

3 files changed

+82
-19
lines changed

3 files changed

+82
-19
lines changed

Examples/base_entity/Program.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ class AsTableLog
110110
public Guid id { get; set; }
111111
public string msg { get; set; }
112112
public DateTime createtime { get; set; }
113+
public int click { get; set; }
113114
}
114115

115116
public class SomeEntity
@@ -503,14 +504,14 @@ int LocalConcurrentDictionaryIsTypeKey(Type dictType, int level = 1)
503504

504505
var testitems = new[]
505506
{
506-
new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11") },
507-
new AsTableLog{ msg = "msg02", createtime = DateTime.Parse("2022-1-2 14:00:12") },
508-
new AsTableLog{ msg = "msg03", createtime = DateTime.Parse("2022-2-2 15:00:13") },
509-
new AsTableLog{ msg = "msg04", createtime = DateTime.Parse("2022-2-8 15:00:13") },
510-
new AsTableLog{ msg = "msg05", createtime = DateTime.Parse("2022-3-8 15:00:13") },
511-
new AsTableLog{ msg = "msg06", createtime = DateTime.Parse("2022-4-8 15:00:13") },
512-
new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-6-8 15:00:13") },
513-
new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-7-1") }
507+
new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11"), click = 1 },
508+
new AsTableLog{ msg = "msg02", createtime = DateTime.Parse("2022-1-2 14:00:12"), click = 2 },
509+
new AsTableLog{ msg = "msg03", createtime = DateTime.Parse("2022-2-2 15:00:13"), click = 3 },
510+
new AsTableLog{ msg = "msg04", createtime = DateTime.Parse("2022-2-8 15:00:13"), click = 4 },
511+
new AsTableLog{ msg = "msg05", createtime = DateTime.Parse("2022-3-8 15:00:13"), click = 5 },
512+
new AsTableLog{ msg = "msg06", createtime = DateTime.Parse("2022-4-8 15:00:13"), click = 6 },
513+
new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-6-8 15:00:13"), click = 7 },
514+
new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-7-1"), click = 8}
514515
};
515516
var sqlatb = fsql.Insert(testitems).NoneParameter();
516517
var sqlat = sqlatb.ToSql();
@@ -596,6 +597,15 @@ int LocalConcurrentDictionaryIsTypeKey(Type dictType, int level = 1)
596597
var sqls601 = sqls6.ToSql();
597598
var sqls602 = sqls6.ToList();
598599

600+
var sqls7 = fsql.Select<AsTableLog>().Where(a => a.createtime < DateTime.Parse("2022-5-1")).ToAggregate(g => new
601+
{
602+
sum1 = g.Sum(g.Key.click),
603+
cou1 = g.Count(),
604+
avg1 = g.Avg(g.Key.click),
605+
min = g.Min(g.Key.click),
606+
max = g.Max(g.Key.click)
607+
});
608+
599609
fsql.Aop.AuditValue += new EventHandler<FreeSql.Aop.AuditValueEventArgs>((_, e) =>
600610
{
601611

FreeSql.DbContext/FreeSql.DbContext.xml

Lines changed: 0 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,7 +1084,38 @@ protected TReturn InternalToAggregate<TReturn>(Expression select)
10841084
var index = 0;
10851085

10861086
_commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, null, _whereGlobalFilter, null, null, false); //不走 DTO 映射,不处理 IncludeMany
1087-
return this.ToListMapReader<TReturn>(new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null)).FirstOrDefault();
1087+
var af = new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null);
1088+
if (GetTableRuleUnions().Count <= 1) return this.ToListMapReader<TReturn>(af).FirstOrDefault();
1089+
1090+
var affield = af.field;
1091+
var allMemExps = new FindAllMemberExpressionVisitor(this);
1092+
allMemExps.Visit(select);
1093+
field.Clear();
1094+
var fieldAlias = new Dictionary<string, bool>();
1095+
var fieldReplaced = new Dictionary<string, bool>();
1096+
foreach (var memExp in allMemExps.Result)
1097+
{
1098+
var gef = GetExpressionField(memExp.Item1, FieldAliasOptions.AsProperty);
1099+
var geffield = gef.field;
1100+
if (fieldReplaced.ContainsKey(geffield)) continue;
1101+
fieldReplaced.Add(geffield, true);
1102+
1103+
field.Append(", ").Append(gef.field);
1104+
if (fieldAlias.ContainsKey(memExp.Item2.Attribute.Name))
1105+
{
1106+
field.Append(_commonUtils.FieldAsAlias($"aas{fieldAlias.Count}"));
1107+
affield = affield.Replace(geffield, $"ftba.aas{fieldAlias.Count}");
1108+
}
1109+
else
1110+
{
1111+
fieldAlias.Add(memExp.Item2.Attribute.Name, true);
1112+
affield = affield.Replace(geffield, $"ftba.{string.Join(".", geffield.Split('.').Skip(1))}");
1113+
}
1114+
}
1115+
1116+
var sql = this.ToSql(field.Remove(0, 2).ToString());
1117+
sql = $"{_select} {affield} FROM ( \r\n {sql.Replace("\r\n", "\r\n ")}\r\n) ftba";
1118+
return ToListMrPrivate<TReturn>(sql, af, null).FirstOrDefault();
10881119
}
10891120
finally
10901121
{
@@ -1543,7 +1574,38 @@ async protected Task<TReturn> InternalToAggregateAsync<TReturn>(Expression selec
15431574
var index = 0;
15441575

15451576
_commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, null, _whereGlobalFilter, null, null, false); //不走 DTO 映射,不处理 IncludeMany
1546-
return (await this.ToListMapReaderAsync<TReturn>(new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null), cancellationToken)).FirstOrDefault();
1577+
var af = new ReadAnonymousTypeAfInfo(map, field.Length > 0 ? field.Remove(0, 2).ToString() : null);
1578+
if (GetTableRuleUnions().Count <= 1) return (await this.ToListMapReaderAsync<TReturn>(af, cancellationToken)).FirstOrDefault();
1579+
1580+
var affield = af.field;
1581+
var allMemExps = new FindAllMemberExpressionVisitor(this);
1582+
allMemExps.Visit(select);
1583+
field.Clear();
1584+
var fieldAlias = new Dictionary<string, bool>();
1585+
var fieldReplaced = new Dictionary<string, bool>();
1586+
foreach (var memExp in allMemExps.Result)
1587+
{
1588+
var gef = GetExpressionField(memExp.Item1, FieldAliasOptions.AsProperty);
1589+
var geffield = gef.field;
1590+
if (fieldReplaced.ContainsKey(geffield)) continue;
1591+
fieldReplaced.Add(geffield, true);
1592+
1593+
field.Append(", ").Append(gef.field);
1594+
if (fieldAlias.ContainsKey(memExp.Item2.Attribute.Name))
1595+
{
1596+
field.Append(_commonUtils.FieldAsAlias($"aas{fieldAlias.Count}"));
1597+
affield = affield.Replace(geffield, $"ftba.aas{fieldAlias.Count}");
1598+
}
1599+
else
1600+
{
1601+
fieldAlias.Add(memExp.Item2.Attribute.Name, true);
1602+
affield = affield.Replace(geffield, $"ftba.{string.Join(".", geffield.Split('.').Skip(1))}");
1603+
}
1604+
}
1605+
1606+
var sql = this.ToSql(field.Remove(0, 2).ToString());
1607+
sql = $"{_select} {affield} FROM ( \r\n {sql.Replace("\r\n", "\r\n ")}\r\n) ftba";
1608+
return (await ToListMrPrivateAsync<TReturn>(sql, af, null, cancellationToken)).FirstOrDefault();
15471609
}
15481610
finally
15491611
{

0 commit comments

Comments
 (0)