diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index 563be88b..0c0bbd01 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -1104,82 +1104,6 @@
-
-
- 动态创建实体类型
-
-
-
-
- 配置Class
-
- 类名
- 类标记的特性[Table(Name = "xxx")] [Index(xxxx)]
-
-
-
-
- 配置属性
-
- 属性名称
- 属性类型
- 属性标记的特性-支持多个
-
-
-
-
- 配置属性
-
- 属性名称
- 属性类型
- 该属性是否重写父类属性
- 属性标记的特性-支持多个
-
-
-
-
- 配置属性
-
- 属性名称
- 属性类型
- 该属性是否重写父类属性
- 属性默认值
- 属性标记的特性-支持多个
-
-
-
-
- 配置父类
-
- 父类类型
-
-
-
-
- Override属性
-
-
-
-
-
- Emit动态创建出Class - Type
-
-
-
-
-
- 首字母小写
-
-
-
-
-
-
- 首字母大写
-
-
-
-
获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null
@@ -3676,177 +3600,6 @@
-
-
- 测试数据库是否连接正确,本方法执行如下命令:
- MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1
- Oracle: SELECT 1 FROM dual
-
- 命令超时设置(秒)
-
- true: 成功, false: 失败
-
-
-
- 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
-
-
-
-
-
-
-
-
-
- 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 查询
-
-
-
-
-
-
-
-
- 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 查询
-
-
-
-
-
-
-
-
- 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 查询
-
-
-
-
-
-
-
-
- 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 在【主库】执行
-
-
-
-
-
-
-
-
- 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 在【主库】执行
-
-
-
-
-
-
-
-
- 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
-
-
-
-
-
-
-
-
-
-
- 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
-
- 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
-
-
-
-
-
-
-
-
-
-
-
- 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
可自定义解析表达式
@@ -4846,12 +4599,6 @@
超时
-
-
- 获取资源
-
-
-
使用完毕后,归还资源
@@ -4927,12 +4674,6 @@
资源对象
-
-
- 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象
-
- 资源对象
-
归还对象给对象池的时候触发
@@ -5863,28 +5604,6 @@
请使用 fsql.InsertDict(dict) 方法插入字典数据
-
-
- 动态构建Class Type
-
-
-
-
-
- 根据字典,创建 table 对应的实体对象
-
-
-
-
-
-
-
- 根据实体对象,创建 table 对应的字典
-
-
-
-
-
C#: that >= between && that <= and
diff --git a/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs b/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs
index 47f78852..f6ba9294 100644
--- a/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs
+++ b/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs
@@ -101,7 +101,7 @@ namespace FreeSql.Internal.CommonProvider
if (objects == null) return;
var syncObjects = objects.Where(a => a.tableSchema?.Type != null &&
(
- a.tableSchema.Type.Name == "DynamicDbContext" && a.tableSchema.Columns.Any()
+ a.tableSchema.Type == typeof(object) && a.tableSchema.Columns.Any()
||
a.tableSchema.Type != typeof(object) && _dicSycedGetOrAdd(a.tableSchema.Type).ContainsKey(GetTableNameLowerOrUpper(a.tableName)) == false
) &&
diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs
index 36c475f1..4dba5438 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs
+++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs
@@ -36,15 +36,41 @@ public static partial class FreeSqlPostgreSQLGlobalExtensions
///
public static OnConflictDoUpdate OnConflictDoUpdate(this IInsert that, Expression> columns = null) where T1 : class => new FreeSql.PostgreSQL.Curd.OnConflictDoUpdate(that.InsertIdentity(), columns);
- #region ExecutePgCopy
- ///
- /// 批量插入或更新(操作的字段数量超过 2000 时收益大)
- /// 实现原理:使用 PgCopy 插入临时表,再执行 INSERT INTO t1 select * from #temp ON CONFLICT(""id"") DO UPDATE SET ...
- ///
- ///
- ///
- ///
- public static int ExecutePgCopy(this IInsertOrUpdate that) where T : class
+ ///
+ /// PostgreSQL
+ /// select distinct on(subject) * from score order by subject, score desc, name;
+ ///
+ public static ISelect DistinctOn(this ISelect query, Expression> selector)
+ {
+ var select = query as FreeSql.PostgreSQL.Curd.PostgreSQLSelect;
+ if (select == null) throw new Exception($"{nameof(DistinctOn)} 是 FreeSql.Provider.PostgreSQL 特有的功能");
+ var s0p = select as Select0Provider;
+ var orderByOld = s0p._orderby;
+ var orderByNew = "";
+ try
+ {
+ s0p._orderby = null;
+ select.OrderBy(selector);
+ orderByNew = s0p._orderby;
+ }
+ finally
+ {
+ s0p._orderby = orderByOld;
+ }
+ if (orderByNew.StartsWith(" \r\nORDER BY "))
+ s0p._select = $"{s0p._select} distinct on({orderByNew.Substring(12)}) ";
+ return select;
+ }
+
+ #region ExecutePgCopy
+ ///
+ /// 批量插入或更新(操作的字段数量超过 2000 时收益大)
+ /// 实现原理:使用 PgCopy 插入临时表,再执行 INSERT INTO t1 select * from #temp ON CONFLICT(""id"") DO UPDATE SET ...
+ ///
+ ///
+ ///
+ ///
+ public static int ExecutePgCopy(this IInsertOrUpdate that) where T : class
{
var upsert = that as InsertOrUpdateProvider;
if (upsert._source.Any() != true || upsert._tempPrimarys.Any() == false) return 0;