Skip to content

Commit

Permalink
- 修复 AsTable 分表 ToAggregate 无法得到汇总;#1115
Browse files Browse the repository at this point in the history
  • Loading branch information
2881099 committed May 24, 2022
1 parent 792ffd4 commit 5a9c92b
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 19 deletions.
26 changes: 18 additions & 8 deletions Examples/base_entity/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ class AsTableLog
public Guid id { get; set; }
public string msg { get; set; }
public DateTime createtime { get; set; }
public int click { get; set; }
}

public class SomeEntity
Expand Down Expand Up @@ -503,14 +504,14 @@ int LocalConcurrentDictionaryIsTypeKey(Type dictType, int level = 1)

var testitems = new[]
{
new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11") },
new AsTableLog{ msg = "msg02", createtime = DateTime.Parse("2022-1-2 14:00:12") },
new AsTableLog{ msg = "msg03", createtime = DateTime.Parse("2022-2-2 15:00:13") },
new AsTableLog{ msg = "msg04", createtime = DateTime.Parse("2022-2-8 15:00:13") },
new AsTableLog{ msg = "msg05", createtime = DateTime.Parse("2022-3-8 15:00:13") },
new AsTableLog{ msg = "msg06", createtime = DateTime.Parse("2022-4-8 15:00:13") },
new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-6-8 15:00:13") },
new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-7-1") }
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"), click = 2 },
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"), click = 4 },
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"), click = 6 },
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"), click = 8}
};
var sqlatb = fsql.Insert(testitems).NoneParameter();
var sqlat = sqlatb.ToSql();
Expand Down Expand Up @@ -596,6 +597,15 @@ int LocalConcurrentDictionaryIsTypeKey(Type dictType, int level = 1)
var sqls601 = sqls6.ToSql();
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) =>
{

Expand Down
9 changes: 0 additions & 9 deletions FreeSql.DbContext/FreeSql.DbContext.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -1084,7 +1084,38 @@ protected TReturn InternalToAggregate<TReturn>(Expression select)
var index = 0;

_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
{
Expand Down Expand Up @@ -1543,7 +1574,38 @@ async protected Task<TReturn> InternalToAggregateAsync<TReturn>(Expression selec
var index = 0;

_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
{
Expand Down

0 comments on commit 5a9c92b

Please sign in to comment.