From ff61607e01f72676bbf21341941c52c013605a4d Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Thu, 26 Mar 2020 23:43:25 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20=E9=9B=86=E5=90=88?= =?UTF-8?q?=E5=AF=BC=E8=88=AA=E5=B1=9E=E6=80=A7=E8=A1=A8=E8=BE=BE=E5=BC=8F?= =?UTF-8?q?=E4=B8=AD=E5=BF=98=E8=AE=B0=E4=BD=BF=E7=94=A8=20AsSelect()=20?= =?UTF-8?q?=E7=9A=84=E5=8F=8B=E5=A5=BD=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/UnitTest1.cs | 3 - FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 60 +++++-- FreeSql/FreeSql.xml | 147 +----------------- FreeSql/Internal/CommonExpression.cs | 3 + .../MsAccessExpression.cs | 1 + .../FreeSql.Provider.MySql/MySqlExpression.cs | 1 + .../Dameng/OdbcDamengExpression.cs | 1 + .../Default/OdbcExpression.cs | 1 + .../MySql/OdbcMySqlExpression.cs | 1 + .../Oracle/OdbcOracleExpression.cs | 1 + .../SqlServer/OdbcSqlServerExpression.cs | 1 + .../OracleExpression.cs | 1 + .../SqlServerExpression.cs | 1 + .../SqliteExpression.cs | 1 + readme.md | 2 +- 15 files changed, 60 insertions(+), 165 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index bc70c511..f7df0e51 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -550,7 +550,6 @@ namespace FreeSql.Tests - var gkjdjd = g.sqlite.Select().Where(a => a.Post.AsSelect().Count() > 0).ToList(); var testrunsql1 = g.mysql.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); @@ -892,8 +891,6 @@ namespace FreeSql.Tests - - var ttt1 = g.sqlite.Select().Where(a => a.Childs.AsSelect().Any(b => b.Title == "111")).ToList(); diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 81668363..546f8c22 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -51,18 +51,15 @@ public static partial class FreeSqlGlobalExtensions /// /// 获取 Type 的原始 c# 文本表示 /// - /// + /// /// - public static string DisplayCsharp(this Type that) + internal static string DisplayCsharp(this Type type, bool isNameSpace = true) { - return DisplayCsharp(that, true); - } - static string DisplayCsharp(this Type that, bool isNameSpace) - { - if (that == typeof(void)) return "void"; - if (that.IsGenericParameter) return that.Name; + if (type == null) return null; + if (type == typeof(void)) return "void"; + if (type.IsGenericParameter) return type.Name; var sb = new StringBuilder(); - var nestedType = that; + var nestedType = type; while (nestedType.IsNested) { sb.Insert(0, ".").Insert(0, DisplayCsharp(nestedType.DeclaringType, false)); @@ -71,22 +68,22 @@ public static partial class FreeSqlGlobalExtensions if (isNameSpace && string.IsNullOrEmpty(nestedType.Namespace) == false) sb.Insert(0, ".").Insert(0, nestedType.Namespace); - if (that.IsGenericType == false) - return sb.Append(that.Name).ToString(); + if (type.IsGenericType == false) + return sb.Append(type.Name).ToString(); - var genericParameters = that.GetGenericArguments(); - if (that.IsNested && that.DeclaringType.IsGenericType) + var genericParameters = type.GetGenericArguments(); + if (type.IsNested && type.DeclaringType.IsGenericType) { var dic = genericParameters.ToDictionary(a => a.Name); - foreach (var nestedGenericParameter in that.DeclaringType.GetGenericArguments()) + foreach (var nestedGenericParameter in type.DeclaringType.GetGenericArguments()) if (dic.ContainsKey(nestedGenericParameter.Name)) dic.Remove(nestedGenericParameter.Name); genericParameters = dic.Values.ToArray(); } if (genericParameters.Any() == false) - return sb.Append(that.Name).ToString(); + return sb.Append(type.Name).ToString(); - sb.Append(that.Name.Remove(that.Name.IndexOf('`'))).Append("<"); + sb.Append(type.Name.Remove(type.Name.IndexOf('`'))).Append("<"); var genericTypeIndex = 0; foreach (var genericType in genericParameters) { @@ -95,6 +92,37 @@ public static partial class FreeSqlGlobalExtensions } return sb.Append(">").ToString(); } + internal static string DisplayCsharp(this MethodInfo method, bool isOverride) + { + if (method == null) return null; + var sb = new StringBuilder(); + if (method.IsPublic) sb.Append("public "); + if (method.IsAssembly) sb.Append("internal "); + if (method.IsFamily) sb.Append("protected "); + if (method.IsPrivate) sb.Append("private "); + if (method.IsPrivate) sb.Append("private "); + if (method.IsStatic) sb.Append("static "); + if (method.IsAbstract && method.DeclaringType.IsInterface == false) sb.Append("abstract "); + if (method.IsVirtual && method.DeclaringType.IsInterface == false) sb.Append(isOverride ? "override " : "virtual "); + sb.Append(method.ReturnType.DisplayCsharp()).Append(" ").Append(method.Name); + + var genericParameters = method.GetGenericArguments(); + if (method.DeclaringType.IsNested && method.DeclaringType.DeclaringType.IsGenericType) + { + var dic = genericParameters.ToDictionary(a => a.Name); + foreach (var nestedGenericParameter in method.DeclaringType.DeclaringType.GetGenericArguments()) + if (dic.ContainsKey(nestedGenericParameter.Name)) + dic.Remove(nestedGenericParameter.Name); + genericParameters = dic.Values.ToArray(); + } + if (genericParameters.Any()) + sb.Append("<") + .Append(string.Join(", ", genericParameters.Select(a => a.DisplayCsharp()))) + .Append(">"); + + sb.Append("(").Append(string.Join(", ", method.GetParameters().Select(a => $"{a.ParameterType.DisplayCsharp()} {a.Name}"))).Append(")"); + return sb.ToString(); + } public static object CreateInstanceGetDefaultValue(this Type that) { if (that == null) return null; diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 68ddd4ef..e63a0ae4 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2285,137 +2285,6 @@ - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 - - - - - - - - - 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > ?age", new { age = 25 }) - - - - - - - 查询 - - - - - - - 查询,ExecuteArrayAsync("select * from user where age > ?age", new { age = 25 }) - - - - - - - - 查询 - - - - - - - 查询,ExecuteDataSetAsync("select * from user where age > ?age; select 2", new { age = 25 }) - - - - - - - - 查询 - - - - - - - 查询,ExecuteDataTableAsync("select * from user where age > ?age", new { age = 25 }) - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > ?age", new { age = 25 }) - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > ?age", new { age = 25 }) - - - - - - - - 执行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 }) - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > ?age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > ?age; select * from address", new { age = 25 }) - - - - - - 可自定义解析表达式 @@ -2939,12 +2808,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -3015,12 +2878,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 @@ -3194,11 +3051,11 @@ - + 获取 Type 的原始 c# 文本表示 - + diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index d7f48fdf..5493f699 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1021,6 +1021,7 @@ namespace FreeSql.Internal other3Exp = ExpressionLambdaToSqlOther(exp3, tsc); if (string.IsNullOrEmpty(other3Exp) == false) return other3Exp; if (exp3.IsParameter() == false) return formatSql(Expression.Lambda(exp3).Compile().DynamicInvoke(), tsc.mapType, tsc.mapColumnTmp, tsc.dbParams); + if (exp3.Method.DeclaringType == typeof(Enumerable)) throw new Exception($"未实现函数表达式 {exp3} 解析。如果正在操作导航属性集合,请使用 .AsSelect().{exp3.Method.Name}({(exp3.Arguments.Count > 1 ? "..." : "")})"); throw new Exception($"未实现函数表达式 {exp3} 解析"); case ExpressionType.Parameter: case ExpressionType.MemberAccess: @@ -1292,6 +1293,8 @@ namespace FreeSql.Internal } if (tb2.ColumnsByCsIgnore.ContainsKey(mp2.Member.Name)) throw new ArgumentException($"{tb2.DbName}.{mp2.Member.Name} 被忽略,请检查 IsIgnore 设置,确认 get/set 为 public"); + if (tb2.GetTableRef(mp2.Member.Name, false) != null) + throw new ArgumentException($"{tb2.DbName}.{mp2.Member.Name} 导航属性集合忘了 .AsSelect() 吗?如果在 ToList(a => a.{mp2.Member.Name}) 中使用,请移步参考 IncludeMany 文档。"); throw new ArgumentException($"{tb2.DbName} 找不到列 {mp2.Member.Name}"); } var col2 = tb2.ColumnsByCs[mp2.Member.Name]; diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs index 53fbb008..2692b868 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs @@ -74,6 +74,7 @@ namespace FreeSql.MsAccess if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { + if (argIndex >= callExp.Arguments.Count) break; tsc.SetMapColumnTmp(null); var args1 = getExp(callExp.Arguments[argIndex]); var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); diff --git a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs index 8df2fa3b..d7339eac 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs @@ -101,6 +101,7 @@ namespace FreeSql.MySql if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { + if (argIndex >= callExp.Arguments.Count) break; tsc.SetMapColumnTmp(null); var args1 = getExp(callExp.Arguments[argIndex]); var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs index 03468326..11604c98 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs @@ -105,6 +105,7 @@ namespace FreeSql.Odbc.Dameng if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { + if (argIndex >= callExp.Arguments.Count) break; tsc.SetMapColumnTmp(null); var args1 = getExp(callExp.Arguments[argIndex]); var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs index fba05ba0..df861404 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs @@ -108,6 +108,7 @@ namespace FreeSql.Odbc.Default if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { + if (argIndex >= callExp.Arguments.Count) break; tsc.SetMapColumnTmp(null); var args1 = getExp(callExp.Arguments[argIndex]); var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs index 5201379c..3fdf6e2a 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs @@ -101,6 +101,7 @@ namespace FreeSql.Odbc.MySql if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { + if (argIndex >= callExp.Arguments.Count) break; tsc.SetMapColumnTmp(null); var args1 = getExp(callExp.Arguments[argIndex]); var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs index d55cd439..d09da364 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs @@ -105,6 +105,7 @@ namespace FreeSql.Odbc.Oracle if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { + if (argIndex >= callExp.Arguments.Count) break; tsc.SetMapColumnTmp(null); var args1 = getExp(callExp.Arguments[argIndex]); var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs index e44aa42d..dcbdfec7 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs @@ -105,6 +105,7 @@ namespace FreeSql.Odbc.SqlServer if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { + if (argIndex >= callExp.Arguments.Count) break; tsc.SetMapColumnTmp(null); var args1 = getExp(callExp.Arguments[argIndex]); var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); diff --git a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs index fc0d0885..5169f563 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs @@ -105,6 +105,7 @@ namespace FreeSql.Oracle if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { + if (argIndex >= callExp.Arguments.Count) break; tsc.SetMapColumnTmp(null); var args1 = getExp(callExp.Arguments[argIndex]); var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs index 58e9c669..8aba97e0 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs @@ -105,6 +105,7 @@ namespace FreeSql.SqlServer if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { + if (argIndex >= callExp.Arguments.Count) break; tsc.SetMapColumnTmp(null); var args1 = getExp(callExp.Arguments[argIndex]); var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index 81108e95..325aa535 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -101,6 +101,7 @@ namespace FreeSql.Sqlite if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { + if (argIndex >= callExp.Arguments.Count) break; tsc.SetMapColumnTmp(null); var args1 = getExp(callExp.Arguments[argIndex]); var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); diff --git a/readme.md b/readme.md index 978ee2da..2e6b3bec 100644 --- a/readme.md +++ b/readme.md @@ -206,7 +206,7 @@ Elapsed: 00:00:00.6495301; Query Entity Counts: 131072; ORM: Dapper ## Donation -L*y 58元、花花 88元、麦兜很乖 50元、网络来者 2000元、John 99.99元、alex 666元 +L*y 58元、花花 88元、麦兜很乖 50元、网络来者 2000元、John 99.99元、alex 666元、bacongao 36元 > Thank you for your donation