From df3073819dedcc73b86bdbba1c1905bc4598d81a Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 2 Mar 2023 19:14:09 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20ISelectGrouping=20Firs?= =?UTF-8?q?t=20=E6=96=B9=E6=B3=95=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base_entity/AspNetRoleClaims/ids_api.db | Bin 176128 -> 266240 bytes Examples/base_entity/Program.cs | 29 ++++++++++++------ .../Interface/Curd/ISelect/ISelectGrouping.cs | 9 ++++++ .../SelectProvider/Select1Provider.cs | 1 + .../SelectProvider/SelectGroupingProvider.cs | 2 ++ 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Examples/base_entity/AspNetRoleClaims/ids_api.db b/Examples/base_entity/AspNetRoleClaims/ids_api.db index 41420d00c24c9da33b258c04905d1aed5ddd03c9..de4c821a4c586ff813b7972dd967267cf5cc6d75 100644 GIT binary patch delta 7810 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 delta 242 zcmZozAkgrDYl5_3J_7@THW0&r^h6zF(R>EIa1U0X5F`I@kc0^TZ@$?ZOPcsuE17}Z z&A<6MFKlM{@JD_NBcp*i#}Wo{hGYhgw;XHOCUB&(tYh().IncludeMany(a => a.Roles); + var displayNameTb = fsql.CodeFirst.GetTableByEntity(typeof(DeviceCodes)); var joinsql1 = fsql.Select() @@ -598,7 +600,7 @@ namespace base_entity Console.WriteLine(sw111); - var testsql01 = fsql.Select() + var testsql01 = fsql.Select() //.GroupBy(a => new { a.Avatar, a.GroupId }) //.Having(g => g.Sum(g.Value.Sort) > 0) .WithTempQuery(a => new @@ -662,13 +664,13 @@ namespace base_entity } } }; - - Npgsql.NpgsqlConnection.GlobalTypeMapper.UseNetTopologySuite(); - var geo = new Point(10, 20); - fsql.Select() - .Where(a => geo.Distance(a.Center) < 100).ToList(); - - + if (fsql.Ado.DataType == DataType.PostgreSQL) + { + Npgsql.NpgsqlConnection.GlobalTypeMapper.UseNetTopologySuite(); + var geo = new Point(10, 20); + fsql.Select() + .Where(a => geo.Distance(a.Center) < 100).ToList(); + } var items = new List(); for (var a = 0; a < 3; a++) items.Add(new User1 { Id = Guid.NewGuid(), Avatar = $"avatar{a}" }); @@ -860,6 +862,15 @@ namespace base_entity list2 = userRepository.Select.Where(b => b.GroupId == a.Id).ToList(b => b.Nickname), }); + var testsublist2 = fsql.Select() + .GroupBy(a => new { a.Id }) + .First(a => new + { + a.Id, + list = userRepository.Select.Where(b => b.GroupId == a.Id).ToList(), + list2 = userRepository.Select.Where(b => b.GroupId == a.Id).ToList(b => b.Nickname), + }); + Dictionary dic = new Dictionary(); dic.Add("id", 1); @@ -1985,7 +1996,7 @@ namespace base_entity public virtual string Code { get; set; } public virtual string Name { get; set; } } - [Table(Name = "`FreeSqlTest`.`bdd_1`")] + [Table(Name = "`bdd_1`")] class GoodsData : BaseDataEntity { public override Int32 CategoryId { get; set; } diff --git a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs index 286aee94..cb035c6b 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs @@ -16,6 +16,8 @@ namespace FreeSql Task CountAsync(CancellationToken cancellationToken = default); Task> ToListAsync(Expression, TReturn>> select, CancellationToken cancellationToken = default); Task> ToDictionaryAsync(Expression, TElement>> elementSelector, CancellationToken cancellationToken = default); + Task FirstAsync(Expression, TReturn>> select, CancellationToken cancellationToken = default); + #endif /// @@ -54,6 +56,13 @@ namespace FreeSql /// List ToList(Expression, TReturn>> select); Dictionary ToDictionary(Expression, TElement>> elementSelector); + /// + /// 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 + /// + /// + /// + /// + TReturn First(Expression, TReturn>> select); /// /// 【linq to sql】专用方法,不建议直接使用 diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index 76d6164a..786d0943 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -1154,6 +1154,7 @@ namespace FreeSql.Internal.CommonProvider var tbrefMid = _commonUtils.GetTableByEntity(tbref.RefMiddleEntityType); var tbrefMidName = _tableRules?.FirstOrDefault()?.Invoke(tbref.RefMiddleEntityType, tbrefMid.DbName) ?? tbrefMid.DbName; var sbJoin = new StringBuilder().Append($"{_commonUtils.QuoteSqlName(tbrefMidName)} midtb ON "); + if (_orm.CodeFirst.IsAutoSyncStructure && tbrefMid.Type != typeof(object)) _orm.CodeFirst.SyncStructure(tbrefMid.Type, tbrefMidName); for (var z = 0; z < tbref.RefColumns.Count; z++) { if (z > 0) sbJoin.Append(" AND "); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index 3ecf553e..bdbedc77 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -329,6 +329,7 @@ namespace FreeSql.Internal.CommonProvider } public List Select(Expression, TReturn>> select) => ToList(select); + public TReturn First(Expression, TReturn>> select) => ToList(select).FirstOrDefault(); public List ToList(Expression, TReturn>> select) { _lambdaParameter = select?.Parameters[0]; @@ -344,6 +345,7 @@ namespace FreeSql.Internal.CommonProvider #else async public Task CountAsync(CancellationToken cancellationToken = default) => _select._cancel?.Invoke() == true ? 0 : long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_select._connection, _select._transaction, CommandType.Text, $"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta", _select._commandTimeout, _select._params.ToArray(), cancellationToken)), out var trylng) ? trylng : default(long); + async public Task FirstAsync(Expression, TReturn>> select, CancellationToken cancellationToken = default) => (await ToListAsync(select, cancellationToken)).FirstOrDefault(); public Task> ToListAsync(Expression, TReturn>> select, CancellationToken cancellationToken = default) { var map = new ReadAnonymousTypeInfo();