diff --git a/Examples/base_entity/AspNetRoleClaims/ids_api.db b/Examples/base_entity/AspNetRoleClaims/ids_api.db index 41420d00..de4c821a 100644 Binary files a/Examples/base_entity/AspNetRoleClaims/ids_api.db and b/Examples/base_entity/AspNetRoleClaims/ids_api.db differ diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 21f714be..9d022d95 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -569,6 +569,8 @@ namespace base_entity #endregion fsql.UseJsonMap(); + fsql.Select().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();