diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 54ceec11..35712f50 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -110,6 +110,7 @@ namespace base_entity public Guid id { get; set; } public string msg { get; set; } public DateTime createtime { get; set; } + public int click { get; set; } } public class SomeEntity @@ -503,14 +504,14 @@ namespace base_entity 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(); @@ -596,6 +597,15 @@ namespace base_entity var sqls601 = sqls6.ToSql(); var sqls602 = sqls6.ToList(); + var sqls7 = fsql.Select().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((_, e) => { diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index d34b34ef..4335acb5 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -786,14 +786,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs index 9cdbfed4..12988a7b 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs @@ -1084,7 +1084,38 @@ namespace FreeSql.Internal.CommonProvider var index = 0; _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, null, _whereGlobalFilter, null, null, false); //不走 DTO 映射,不处理 IncludeMany - return this.ToListMapReader(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(af).FirstOrDefault(); + + var affield = af.field; + var allMemExps = new FindAllMemberExpressionVisitor(this); + allMemExps.Visit(select); + field.Clear(); + var fieldAlias = new Dictionary(); + var fieldReplaced = new Dictionary(); + 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(sql, af, null).FirstOrDefault(); } finally { @@ -1543,7 +1574,38 @@ namespace FreeSql.Internal.CommonProvider var index = 0; _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, null, _whereGlobalFilter, null, null, false); //不走 DTO 映射,不处理 IncludeMany - return (await this.ToListMapReaderAsync(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(af, cancellationToken)).FirstOrDefault(); + + var affield = af.field; + var allMemExps = new FindAllMemberExpressionVisitor(this); + allMemExps.Visit(select); + field.Clear(); + var fieldAlias = new Dictionary(); + var fieldReplaced = new Dictionary(); + 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(sql, af, null, cancellationToken)).FirstOrDefault(); } finally {