From 12be7f00514f79f64b00adca0d843d223c1de79e Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 22 Nov 2019 05:58:17 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E8=B0=83=E6=95=B4=E5=86=85=E9=83=A8?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=8C=96=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E4=B8=BA=E4=BB=A5=E5=90=8E=20Where=20=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E5=8F=82=E6=95=B0=E5=8C=96=E5=81=9A=E5=87=86=E5=A4=87?= =?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/UnitTest2.cs | 13 +++- FreeSql.Tests/FreeSql.Tests/g.cs | 1 + FreeSql/Internal/CommonExpression.cs | 62 ++++++++++++------- .../Internal/CommonProvider/DeleteProvider.cs | 4 +- .../Internal/CommonProvider/InsertProvider.cs | 2 +- .../SelectProvider/Select0Provider.cs | 5 +- .../SelectProvider/Select10Provider.cs | 8 +-- .../SelectProvider/Select1Provider.cs | 4 +- .../SelectProvider/Select2Provider.cs | 8 +-- .../SelectProvider/Select3Provider.cs | 8 +-- .../SelectProvider/Select4Provider.cs | 8 +-- .../SelectProvider/Select5Provider.cs | 8 +-- .../SelectProvider/Select6Provider.cs | 8 +-- .../SelectProvider/Select7Provider.cs | 8 +-- .../SelectProvider/Select8Provider.cs | 8 +-- .../SelectProvider/Select9Provider.cs | 8 +-- .../SelectProvider/SelectGroupingProvider.cs | 6 +- .../Internal/CommonProvider/UpdateProvider.cs | 12 ++-- FreeSql/Internal/CommonUtils.cs | 22 ++++++- .../FreeSql.Provider.MySql/MySqlUtils.cs | 12 +++- .../MySqlConnectorUtils.cs | 12 +++- .../Default/OdbcUtils.cs | 4 +- .../MySql/OdbcMySqlUtils.cs | 3 +- .../Oracle/Curd/OdbcOracleInsert.cs | 6 +- .../Oracle/OdbcOracleUtils.cs | 3 +- .../PostgreSQL/OdbcPostgreSQLUtils.cs | 4 +- .../SqlServer/OdbcSqlServerUtils.cs | 4 +- .../Curd/OracleInsert.cs | 6 +- .../FreeSql.Provider.Oracle/OracleUtils.cs | 11 +++- .../PostgreSQLUtils.cs | 19 +++++- .../SqlServerUtils.cs | 20 +++++- .../FreeSql.Provider.Sqlite/SqliteUtils.cs | 3 +- 32 files changed, 213 insertions(+), 97 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs index 7cc880b5..97b4b8d1 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs @@ -168,17 +168,24 @@ namespace FreeSql.Tests public class TestMySqlStringIsNullable { public Guid id { get; set; } - public string varchar { get; set; } + public string nvarchar { get; set; } [Column(IsNullable = true)] - public string varchar_null { get; set; } + public string nvarchar_null { get; set; } [Column(IsNullable = false)] + public string nvarchar_notnull { get; set; } + + [Column(DbType = "varchar(100)")] + public string varchar { get; set; } + [Column(IsNullable = true, DbType = "varchar(100)")] + public string varchar_null { get; set; } + [Column(IsNullable = false, DbType = "varchar(100)")] public string varchar_notnull { get; set; } } [Fact] public void Test02() { - g.mysql.Select(); + var testparmSelect = g.sqlserver.Select().Where(a => a.nvarchar == "11" && a.nvarchar_notnull == "22" && a.nvarchar_null == "33" && a.varchar == "11" && a.varchar_notnull == "22" && a.varchar_null == "33"); var slsksd = g.mysql.Update().SetSource(new UserLike { Id = Guid.NewGuid(), CreateUserId = 1000, SubjectId = Guid.NewGuid() }) .UpdateColumns(a => new diff --git a/FreeSql.Tests/FreeSql.Tests/g.cs b/FreeSql.Tests/FreeSql.Tests/g.cs index 2fe6231a..f3de6a4e 100644 --- a/FreeSql.Tests/FreeSql.Tests/g.cs +++ b/FreeSql.Tests/FreeSql.Tests/g.cs @@ -37,6 +37,7 @@ public class g .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3") //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=192.168.164.129;uid=sa;pwd=123456;Initial Catalog=ds_shop;Pooling=true;Max Pool Size=3") .UseAutoSyncStructure(true) + //.UseNoneCommandParameter(true) .UseMonitorCommand( cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前 (cmd, traceLog) => Console.WriteLine(traceLog)) diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 593693be..3bb464b3 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -329,23 +329,23 @@ namespace FreeSql.Internal { ExpressionType.Modulo, "%" }, { ExpressionType.Equal, "=" }, }; - public string ExpressionWhereLambdaNoneForeignObject(List _tables, TableInfo table, List _selectColumnMap, Expression exp, Func getSelectGroupingMapString) + public string ExpressionWhereLambdaNoneForeignObject(List _tables, TableInfo table, List _selectColumnMap, Expression exp, Func getSelectGroupingMapString, List dbParams) { - var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table }); + var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table, dbParams = dbParams }); var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) - return $"{sql} = {formatSql(true, null, null)}"; + return $"{sql} = {formatSql(true, null, null, null)}"; if (isBool) return GetBoolString(sql); return sql; } - public string ExpressionWhereLambda(List _tables, Expression exp, Func getSelectGroupingMapString, List whereCascadeExpression) + public string ExpressionWhereLambda(List _tables, Expression exp, Func getSelectGroupingMapString, List whereCascadeExpression, List dbParams) { - var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression }); + var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression, dbParams = dbParams }); var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) - return $"{sql} = {formatSql(true, null, null)}"; + return $"{sql} = {formatSql(true, null, null, null)}"; if (isBool) return GetBoolString(sql); return sql; @@ -357,7 +357,7 @@ namespace FreeSql.Internal var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression }); var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) - sql = $"{sql} = {formatSql(true, null, null)}"; + sql = $"{sql} = {formatSql(true, null, null, null)}"; if (isBool) sql = GetBoolString(sql); @@ -435,7 +435,7 @@ namespace FreeSql.Internal { var enumType = leftMapColumn.CsType.NullableTypeOrThis(); if (enumType.IsEnum) - right = formatSql(Enum.Parse(enumType, right.StartsWith("N'") ? right.Substring(1).Trim('\'') : right.Trim('\'')), leftMapColumn.Attribute.MapType, leftMapColumn); + right = formatSql(Enum.Parse(enumType, right.StartsWith("N'") ? right.Substring(1).Trim('\'') : right.Trim('\'')), leftMapColumn.Attribute.MapType, leftMapColumn, tsc.dbParams); } if (leftMapColumn == null) { @@ -449,7 +449,7 @@ namespace FreeSql.Internal { var enumType = rightMapColumn.CsType.NullableTypeOrThis(); if (enumType.IsEnum) - left = formatSql(Enum.Parse(enumType, left.StartsWith("N'") ? left.Substring(1).Trim('\'') : left.Trim('\'')), rightMapColumn.Attribute.MapType, rightMapColumn); + left = formatSql(Enum.Parse(enumType, left.StartsWith("N'") ? left.Substring(1).Trim('\'') : left.Trim('\'')), rightMapColumn.Attribute.MapType, rightMapColumn, tsc.dbParams); } } } @@ -457,8 +457,8 @@ namespace FreeSql.Internal { if (oper == "=") { - var trueVal = formatSql(true, null, null); - var falseVal = formatSql(false, null, null); + var trueVal = formatSql(true, null, null, null); + var falseVal = formatSql(false, null, null, null); if (left == trueVal) return right; else if (left == falseVal) return $"not({right})"; else if (right == trueVal) return left; @@ -466,8 +466,8 @@ namespace FreeSql.Internal } else if (oper == "<>") { - var trueVal = formatSql(true, null, null); - var falseVal = formatSql(false, null, null); + var trueVal = formatSql(true, null, null, null); + var falseVal = formatSql(false, null, null, null); if (left == trueVal) return $"not({right})"; else if (left == falseVal) return right; else if (right == trueVal) return $"not({left})"; @@ -489,9 +489,9 @@ namespace FreeSql.Internal break; case "AND": case "OR": - if (leftMapColumn != null) left = $"{left} = {formatSql(true, null, null)}"; + if (leftMapColumn != null) left = $"{left} = {formatSql(true, null, null, null)}"; else left = GetBoolString(left); - if (rightMapColumn != null) right = $"{right} = {formatSql(true, null, null)}"; + if (rightMapColumn != null) right = $"{right} = {formatSql(true, null, null, null)}"; else right = GetBoolString(right); break; } @@ -520,7 +520,7 @@ namespace FreeSql.Internal if (notBody.Contains(" IS NOT NULL")) return notBody.Replace(" IS NOT NULL", " IS NULL"); if (notBody.Contains("=")) return notBody.Replace("=", "!="); if (notBody.Contains("!=")) return notBody.Replace("!=", "="); - return $"{notBody} = {formatSql(false, null, null)}"; + return $"{notBody} = {formatSql(false, null, null, null)}"; } return $"not({ExpressionLambdaToSql(notExp, tsc)})"; case ExpressionType.Quote: return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc); @@ -532,7 +532,7 @@ namespace FreeSql.Internal return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc); case ExpressionType.Negate: case ExpressionType.NegateChecked: return "-" + ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc); - case ExpressionType.Constant: return formatSql((exp as ConstantExpression)?.Value, tsc.mapType, tsc.mapColumnTmp); + case ExpressionType.Constant: return formatSql((exp as ConstantExpression)?.Value, tsc.mapType, tsc.mapColumnTmp, tsc.dbParams); case ExpressionType.Conditional: var condExp = exp as ConditionalExpression; return $"case when {ExpressionLambdaToSql(condExp.Test, tsc)} then {ExpressionLambdaToSql(condExp.IfTrue, tsc)} else {ExpressionLambdaToSql(condExp.IfFalse, tsc)} end"; @@ -890,7 +890,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); + if (exp3.IsParameter() == false) return formatSql(Expression.Lambda(exp3).Compile().DynamicInvoke(), tsc.mapType, tsc.mapColumnTmp, tsc.dbParams); throw new Exception($"未实现函数表达式 {exp3} 解析"); case ExpressionType.Parameter: case ExpressionType.MemberAccess: @@ -950,7 +950,7 @@ namespace FreeSql.Internal } break; } - if (expStack.First().NodeType != ExpressionType.Parameter) return formatSql(Expression.Lambda(exp).Compile().DynamicInvoke(), tsc.mapType, tsc.mapColumnTmp); + if (expStack.First().NodeType != ExpressionType.Parameter) return formatSql(Expression.Lambda(exp).Compile().DynamicInvoke(), tsc.mapType, tsc.mapColumnTmp, tsc.dbParams); if (callExp != null) return ExpressionLambdaToSql(callExp, tsc); if (tsc.getSelectGroupingMapString != null && expStack.First().Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate`")) { @@ -1161,7 +1161,7 @@ namespace FreeSql.Internal } if (dicExpressionOperator.TryGetValue(expBinary.NodeType, out var tryoper) == false) { - if (exp.IsParameter() == false) return formatSql(Expression.Lambda(exp).Compile().DynamicInvoke(), tsc.mapType, tsc.mapColumnTmp); + if (exp.IsParameter() == false) return formatSql(Expression.Lambda(exp).Compile().DynamicInvoke(), tsc.mapType, tsc.mapColumnTmp, tsc.dbParams); return ""; } return ExpressionBinary(tryoper, expBinary.Left, expBinary.Right, tsc); @@ -1195,6 +1195,7 @@ namespace FreeSql.Internal public ColumnInfo mapColumnTmp { get; set; } public TableInfo currentTable { get; set; } public List whereCascadeExpression { get; set; } + public List dbParams { get; set; } public string alias001 { get; set; } //单表字段的表别名 public ExpTSC SetMapColumnTmp(ColumnInfo col) @@ -1229,8 +1230,12 @@ namespace FreeSql.Internal isQuoteName = this.isQuoteName, isDisableDiyParse = this.isDisableDiyParse, style = this.style, + //mapType = this.mapType, + //mapTypeTmp = this.mapTypeTmp, + //mapColumnTmp = this.mapColumnTmp, currentTable = this.currentTable, whereCascadeExpression = this.whereCascadeExpression, + dbParams = this.dbParams, alias001 = this.alias001 }; } @@ -1245,8 +1250,12 @@ namespace FreeSql.Internal isQuoteName = this.isQuoteName, isDisableDiyParse = true, style = this.style, + mapType = this.mapType, + mapTypeTmp = this.mapTypeTmp, + mapColumnTmp = this.mapColumnTmp, currentTable = this.currentTable, whereCascadeExpression = this.whereCascadeExpression, + dbParams = this.dbParams, alias001 = this.alias001 }; } @@ -1309,6 +1318,17 @@ namespace FreeSql.Internal } } - public string formatSql(object obj, Type mapType, ColumnInfo mapColumn) => string.Concat(_ado.AddslashesProcessParam(obj, mapType, mapColumn)); + public string formatSql(object obj, Type mapType, ColumnInfo mapColumn, List dbParams) + { + //参数化设置,日后优化 + //if (dbParams != null && mapColumn != null) + //{ + // var paramName = $"exp_{dbParams.Count}"; + // var parm = _common.AppendParamter(dbParams, paramName, mapColumn, mapType ?? mapColumn.Attribute.MapType, mapType == null ? obj : Utils.GetDataReaderValue(mapType, obj)); + // _common.SetParameterSize(parm, mapColumn.Attribute.DbType, mapColumn); + // return _common.QuoteParamterName(paramName); + //} + return string.Concat(_ado.AddslashesProcessParam(obj, mapType, mapColumn)); + } } } diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index ed1bac84..7bd56748 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -22,6 +22,7 @@ namespace FreeSql.Internal.CommonProvider protected int _whereTimes = 0; protected List _whereGlobalFilter; protected List _params = new List(); + protected bool _noneParameter; protected DbTransaction _transaction; protected DbConnection _connection; @@ -31,6 +32,7 @@ namespace FreeSql.Internal.CommonProvider _commonUtils = commonUtils; _commonExpression = commonExpression; _table = _commonUtils.GetTableByEntity(typeof(T1)); + _noneParameter = _orm.CodeFirst.IsNoneCommandParameter; this.Where(_commonUtils.WhereObject(_table, "", dywhere)); if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure(); _whereGlobalFilter = _orm.GlobalFilter.GetFilters(); @@ -85,7 +87,7 @@ namespace FreeSql.Internal.CommonProvider } public abstract List ExecuteDeleted(); - public IDelete Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, exp?.Body, null)); + public IDelete Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, exp?.Body, null, _noneParameter ? _params : null)); public IDelete Where(string sql, object parms = null) { if (string.IsNullOrEmpty(sql)) return this; diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index fd4074c4..0bd497c1 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -451,7 +451,7 @@ namespace FreeSql.Internal.CommonProvider else { sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"{col.CsName}_{didx}"))); - _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}_{didx}", col.Attribute.MapType, val); + _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}_{didx}", col, col.Attribute.MapType, val); } ++colidx2; } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 69fce858..3e292a00 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -35,6 +35,7 @@ namespace FreeSql.Internal.CommonProvider protected Action _trackToList; protected List> _includeToList = new List>(); protected bool _distinct; + protected bool _noneParameter; protected Expression _selectExpression; protected List _whereCascadeExpression = new List(); protected List _whereGlobalFilter; @@ -105,6 +106,7 @@ namespace FreeSql.Internal.CommonProvider toType.GetField("_trackToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._trackToList); toType.GetField("_includeToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._includeToList); toType.GetField("_distinct", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._distinct); + toType.GetField("_noneParameter", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._noneParameter); toType.GetField("_selectExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._selectExpression); toType.GetField("_whereCascadeExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereCascadeExpression); toType.GetField("_whereGlobalFilter", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereGlobalFilter); @@ -116,6 +118,7 @@ namespace FreeSql.Internal.CommonProvider _commonUtils = commonUtils; _commonExpression = commonExpression; _tables.Add(new SelectTableInfo { Table = _commonUtils.GetTableByEntity(typeof(T1)), Alias = "a", On = null, Type = SelectTableInfoType.From }); + _noneParameter = _orm.CodeFirst.IsNoneCommandParameter; this.Where(_commonUtils.WhereObject(_tables.First().Table, "a.", dywhere)); if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure(); } @@ -1051,7 +1054,7 @@ namespace FreeSql.Internal.CommonProvider return this.ToListMapReader((map, field.Length > 0 ? field.Remove(0, 2).ToString() : null)).FirstOrDefault(); } - protected TSelect InternalWhere(Expression exp) => exp == null ? this as TSelect : this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp, null, _whereCascadeExpression)); + protected TSelect InternalWhere(Expression exp) => exp == null ? this as TSelect : this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp, null, _whereCascadeExpression, _noneParameter ? _params : null)); #endregion #if net40 diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs index 372b46dc..39affc4c 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs @@ -153,21 +153,21 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.Where(null); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } ISelect ISelect.WhereIf(bool condition, Expression> exp) { if (condition == false || exp == null) return this.Where(null); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)) : this; + return condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)) : this; } bool ISelect.Any(Expression> exp) { if (exp == null) return this.Any(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).Any(); } #if net40 @@ -226,7 +226,7 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).AnyAsync(); } #endif } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index db3be215..916e22ba 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -348,7 +348,7 @@ namespace FreeSql.Internal.CommonProvider if (tb == null) throw new Exception("Include 参数类型错误"); _isIncluded = true; - _commonExpression.ExpressionWhereLambda(_tables, Expression.MakeMemberAccess(expBody, tb.Properties[tb.ColumnsByCs.First().Value.CsName]), null, null); + _commonExpression.ExpressionWhereLambda(_tables, Expression.MakeMemberAccess(expBody, tb.Properties[tb.ColumnsByCs.First().Value.CsName]), null, null, null); return this; } @@ -422,7 +422,7 @@ namespace FreeSql.Internal.CommonProvider if (tbNav == null) throw new Exception($"类型 {typeof(TNavigate).FullName} 错误,不能使用 IncludeMany"); if (collMem.Expression.NodeType != ExpressionType.Parameter) - _commonExpression.ExpressionWhereLambda(_tables, Expression.MakeMemberAccess(collMem.Expression, tb.Properties[tb.ColumnsByCs.First().Value.CsName]), null, null); + _commonExpression.ExpressionWhereLambda(_tables, Expression.MakeMemberAccess(collMem.Expression, tb.Properties[tb.ColumnsByCs.First().Value.CsName]), null, null, null); TableRef tbref = null; var tbrefOneToManyColumns = new List>(); //临时 OneToMany 三个表关联,第三个表需要前两个表确定 diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs index 1970e43c..8891dc13 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs @@ -130,21 +130,21 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.Where(null); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } ISelect ISelect.WhereIf(bool condition, Expression> exp) { if (condition == false || exp == null) return this; for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } bool ISelect.Any(Expression> exp) { if (exp == null) return this.Any(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).Any(); } #if net40 @@ -203,7 +203,7 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).AnyAsync(); } #endif } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs index 641df438..dd18f595 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs @@ -133,21 +133,21 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.Where(null); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } ISelect ISelect.WhereIf(bool condition, Expression> exp) { if (condition == false || exp == null) return this; for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } bool ISelect.Any(Expression> exp) { if (exp == null) return this.Any(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).Any(); } #if net40 @@ -206,7 +206,7 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).AnyAsync(); } #endif } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs index 95b8195b..64597f32 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs @@ -136,21 +136,21 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.Where(null); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } ISelect ISelect.WhereIf(bool condition, Expression> exp) { if (condition == false || exp == null) return this; for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } bool ISelect.Any(Expression> exp) { if (exp == null) return this.Any(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).Any(); } #if net40 @@ -209,7 +209,7 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).AnyAsync(); } #endif } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs index c78ce9be..af16c69b 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs @@ -139,21 +139,21 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.Where(null); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } ISelect ISelect.WhereIf(bool condition, Expression> exp) { if (condition == false || exp == null) return this; for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } bool ISelect.Any(Expression> exp) { if (exp == null) return this.Any(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).Any(); } #if net40 @@ -212,7 +212,7 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).AnyAsync(); } #endif } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs index 7a7a06be..ed6058ba 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs @@ -142,21 +142,21 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.Where(null); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } ISelect ISelect.WhereIf(bool condition, Expression> exp) { if (condition == false || exp == null) return this; for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } bool ISelect.Any(Expression> exp) { if (exp == null) return this.Any(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).Any(); } #if net40 @@ -215,7 +215,7 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).AnyAsync(); } #endif } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs index 39fb0d10..674f4503 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs @@ -145,21 +145,21 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.Where(null); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } ISelect ISelect.WhereIf(bool condition, Expression> exp) { if (condition == false || exp == null) return this; for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } bool ISelect.Any(Expression> exp) { if (exp == null) return this.Any(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).Any(); } #if net40 @@ -218,7 +218,7 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).AnyAsync(); } #endif } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs index 92c54153..324fe9a0 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs @@ -149,21 +149,21 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.Where(null); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } ISelect ISelect.WhereIf(bool condition, Expression> exp) { if (condition == false || exp == null) return this; for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } bool ISelect.Any(Expression> exp) { if (exp == null) return this.Any(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).Any(); } #if net40 @@ -222,7 +222,7 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).AnyAsync(); } #endif } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs index 8db15de2..fcf28472 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs @@ -147,20 +147,20 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.Where(null); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } ISelect ISelect.WhereIf(bool condition, Expression> exp) { if (condition == false || exp == null) return this; for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)); } bool ISelect.Any(Expression> exp) { if (exp == null) return this.Any(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).Any(); } #if net40 @@ -169,7 +169,7 @@ namespace FreeSql.Internal.CommonProvider { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; - return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); + return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression, _noneParameter ? _params : null)).AnyAsync(); } Task ISelect.ToDataTableAsync(Expression> select) diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index 4021b1d9..0e402bd1 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -84,7 +84,7 @@ namespace FreeSql.Internal.CommonProvider public ISelectGrouping Having(Expression, bool>> exp) { - var sql = _comonExp.ExpressionWhereLambda(null, exp, getSelectGroupingMapString, null); + var sql = _comonExp.ExpressionWhereLambda(null, exp, getSelectGroupingMapString, null, null); var method = _select.GetType().GetMethod("Having", new[] { typeof(string), typeof(object) }); method.Invoke(_select, new object[] { sql, null }); return this; @@ -92,7 +92,7 @@ namespace FreeSql.Internal.CommonProvider public ISelectGrouping OrderBy(Expression, TMember>> column) { - var sql = _comonExp.ExpressionWhereLambda(null, column, getSelectGroupingMapString, null); + var sql = _comonExp.ExpressionWhereLambda(null, column, getSelectGroupingMapString, null, null); var method = _select.GetType().GetMethod("OrderBy", new[] { typeof(string), typeof(object) }); method.Invoke(_select, new object[] { sql, null }); return this; @@ -100,7 +100,7 @@ namespace FreeSql.Internal.CommonProvider public ISelectGrouping OrderByDescending(Expression, TMember>> column) { - var sql = _comonExp.ExpressionWhereLambda(null, column, getSelectGroupingMapString, null); + var sql = _comonExp.ExpressionWhereLambda(null, column, getSelectGroupingMapString, null, null); var method = _select.GetType().GetMethod("OrderBy", new[] { typeof(string), typeof(object) }); method.Invoke(_select, new object[] { $"{sql} DESC", null }); return this; diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 51c04727..5eac94a6 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -353,7 +353,7 @@ namespace FreeSql.Internal.CommonProvider else { _set.Append(_commonUtils.QuoteWriteParamter(col.Column.Attribute.MapType, $"{_commonUtils.QuoteParamterName("p_")}{_params.Count}")); - _commonUtils.AppendParamter(_params, null, col.Column.Attribute.MapType, paramVal); + _commonUtils.AppendParamter(_params, null, col.Column, col.Column.Attribute.MapType, paramVal); } //foreach (var t in _source) Utils.FillPropertyValue(t, tryf.CsName, value); return this; @@ -365,7 +365,7 @@ namespace FreeSql.Internal.CommonProvider switch (nodeType) { case ExpressionType.Equal: - _set.Append(", ").Append(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, exp, null)); + _set.Append(", ").Append(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, exp, null, null)); return this; case ExpressionType.MemberInit: var initExp = body as MemberInitExpression; @@ -401,7 +401,7 @@ namespace FreeSql.Internal.CommonProvider if (body is BinaryExpression == false && nodeType != ExpressionType.Call) return this; var cols = new List(); - var expt = _commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, cols, exp, null); + var expt = _commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, cols, exp, null, null); if (cols.Any() == false) return this; foreach (var col in cols) { @@ -424,7 +424,7 @@ namespace FreeSql.Internal.CommonProvider return this; } - public IUpdate Where(Expression> expression) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, expression?.Body, null)); + public IUpdate Where(Expression> expression) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, expression?.Body, null, _noneParameter ? _params : null)); public IUpdate Where(string sql, object parms = null) { if (string.IsNullOrEmpty(sql)) return this; @@ -564,7 +564,7 @@ namespace FreeSql.Internal.CommonProvider else { sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}"))); - _commonUtils.AppendParamter(_paramsSource, null, col.Attribute.MapType, val); + _commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val); } ++colidx; } @@ -603,7 +603,7 @@ namespace FreeSql.Internal.CommonProvider else { cwsb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}"))); - _commonUtils.AppendParamter(_paramsSource, null, col.Attribute.MapType, val); + _commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val); } if (val == null || val == DBNull.Value) nulls++; } diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index 226d9c05..4b7d9d01 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -13,6 +13,7 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Xml; using System.Xml.XPath; @@ -23,7 +24,7 @@ namespace FreeSql.Internal { public abstract string GetNoneParamaterSqlValue(List specialParams, Type type, object value); - public abstract DbParameter AppendParamter(List _params, string parameterName, Type type, object value); + public abstract DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value); public abstract DbParameter[] GetDbParamtersByObject(string sql, object obj); public abstract string FormatSql(string sql, params object[] args); public abstract string QuoteSqlName(string name); @@ -47,6 +48,25 @@ namespace FreeSql.Internal _orm = orm; } + static Regex _regexSize = new Regex(@"\(([^\)]+)\)", RegexOptions.Compiled); + internal void SetParameterSize(DbParameter parm, string dbtypeFull, ColumnInfo col) + { + if (col == null) return; + if (string.IsNullOrEmpty(dbtypeFull)) return; + var m = _regexSize.Match(dbtypeFull); + if (m.Success == false) return; + var sizeStr = m.Groups[1].Value.Trim(); + if (string.Compare(sizeStr, "max", true) == 0) + { + parm.Size = -1; + return; + } + var sizeArr = sizeStr.Split(','); + if (int.TryParse(sizeArr[0], out var size) == false) return; + if (sizeArr.Length > 1 && int.TryParse(sizeArr[1], out var size2)) size += size2; + parm.Size = size; + } + ConcurrentDictionary dicConfigEntity = new ConcurrentDictionary(); public ICodeFirst ConfigEntity(Action> entity) { diff --git a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs index 52804544..c9a70ec7 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs @@ -18,14 +18,22 @@ namespace FreeSql.MySql { } - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; var ret = new MySqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; if (tp != null) { - if ((MySqlDbType)tp.Value == MySqlDbType.Geometry) + if (col != null && type == typeof(string)) + { + if (col.Attribute.DbType.Contains("VARCHAR")) ret.MySqlDbType = MySqlDbType.VarChar; + else if (col.Attribute.DbType.Contains("CHAR")) ret.MySqlDbType = MySqlDbType.VarChar; + else if (col.Attribute.DbType.Contains("TEXT")) ret.MySqlDbType = MySqlDbType.Text; + else ret.MySqlDbType = MySqlDbType.VarChar; + } + else if ((MySqlDbType)tp.Value == MySqlDbType.Geometry) { ret.MySqlDbType = MySqlDbType.Text; if (value != null) ret.Value = (value as MygisGeometry).AsText(); diff --git a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs index f5646853..a1cfc9d6 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs +++ b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs @@ -18,14 +18,22 @@ namespace FreeSql.MySql { } - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; var ret = new MySqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; if (tp != null) { - if ((MySqlDbType)tp.Value == MySqlDbType.Geometry) + if (col != null && type == typeof(string)) + { + if (col.Attribute.DbType.Contains("VARCHAR")) ret.MySqlDbType = MySqlDbType.VarChar; + else if (col.Attribute.DbType.Contains("CHAR")) ret.MySqlDbType = MySqlDbType.VarChar; + else if (col.Attribute.DbType.Contains("TEXT")) ret.MySqlDbType = MySqlDbType.Text; + else ret.MySqlDbType = MySqlDbType.VarChar; + } + else if ((MySqlDbType)tp.Value == MySqlDbType.Geometry) { ret.MySqlDbType = MySqlDbType.Text; if (value != null) ret.Value = (value as MygisGeometry).AsText(); diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs index 299ed4b9..c4db2879 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs @@ -1,4 +1,5 @@ using FreeSql.Internal; +using FreeSql.Internal.Model; using System; using System.Collections.Generic; using System.Data; @@ -16,9 +17,10 @@ namespace FreeSql.Odbc.Default public OdbcUtils(IFreeSql orm) : base(orm) { } public OdbcAdapter Adapter => _orm.GetOdbcAdapter(); - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; if (value?.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); var ret = new OdbcParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs index fa6f7949..4370826b 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs @@ -18,9 +18,10 @@ namespace FreeSql.Odbc.MySql { } - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; var ret = new OdbcParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; if (tp != null) diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs index 9b542be3..a5b9be8e 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs @@ -68,7 +68,7 @@ namespace FreeSql.Odbc.Oracle else { sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"{col.CsName}_{didx}"))); - _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}_{didx}", col.Attribute.MapType, val); + _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}_{didx}", col, col.Attribute.MapType, val); } ++colidx2; } @@ -110,7 +110,7 @@ namespace FreeSql.Odbc.Oracle return 0; } var identColName = _commonUtils.QuoteSqlName(_identCol.Attribute.Name); - var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol.Attribute.MapType, 0); + var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol, _identCol.Attribute.MapType, 0); identParam.Direction = ParameterDirection.Output; sql = $"{sql} RETURNING {identColName} INTO {identParam.ParameterName}"; var dbParms = _params.Concat(new[] { identParam }).ToArray(); @@ -179,7 +179,7 @@ namespace FreeSql.Odbc.Oracle return 0; } var identColName = _commonUtils.QuoteSqlName(_identCol.Attribute.Name); - var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol.Attribute.MapType, 0); + var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol, _identCol.Attribute.MapType, 0); identParam.Direction = ParameterDirection.Output; sql = $"{sql} RETURNING {identColName} INTO {identParam.ParameterName}"; var dbParms = _params.Concat(new[] { identParam }).ToArray(); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs index 3538f561..c2040d23 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs @@ -16,9 +16,10 @@ namespace FreeSql.Odbc.Oracle { } - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; var dbtype = (OdbcType)_orm.CodeFirst.GetDbInfo(type)?.type; switch (dbtype) { diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs index fc3143cb..bed333aa 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs @@ -10,6 +10,7 @@ using System.Text; using System.Linq.Expressions; using System.Reflection; using System.Data.Odbc; +using FreeSql.Internal.Model; namespace FreeSql.Odbc.PostgreSQL { @@ -63,9 +64,10 @@ namespace FreeSql.Odbc.PostgreSQL return value; } - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; if (value != null) value = getParamterValue(type, value); var ret = new OdbcParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; //if (value.GetType().IsEnum || value.GetType().GenericTypeArguments.FirstOrDefault()?.IsEnum == true) { diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs index 844b735f..c4497b17 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs @@ -1,4 +1,5 @@ using FreeSql.Internal; +using FreeSql.Internal.Model; using System; using System.Collections.Generic; using System.Data; @@ -21,9 +22,10 @@ namespace FreeSql.Odbc.SqlServer public bool IsSqlServer2005 => ServerVersion == 9; public int ServerVersion = 0; - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; if (value?.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); var ret = new OdbcParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs index e1d632ca..259c103b 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs @@ -70,7 +70,7 @@ namespace FreeSql.Oracle.Curd else { sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"{col.CsName}_{didx}"))); - _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}_{didx}", col.Attribute.MapType, val); + _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}_{didx}", col, col.Attribute.MapType, val); } ++colidx2; } @@ -112,7 +112,7 @@ namespace FreeSql.Oracle.Curd return 0; } var identColName = _commonUtils.QuoteSqlName(_identCol.Attribute.Name); - var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol.Attribute.MapType, 0) as OracleParameter; + var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol, _identCol.Attribute.MapType, 0) as OracleParameter; identParam.Direction = ParameterDirection.Output; sql = $"{sql} RETURNING {identColName} INTO {identParam.ParameterName}"; var dbParms = _params.Concat(new[] { identParam }).ToArray(); @@ -180,7 +180,7 @@ namespace FreeSql.Oracle.Curd return 0; } var identColName = _commonUtils.QuoteSqlName(_identCol.Attribute.Name); - var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol.Attribute.MapType, 0) as OracleParameter; + var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol, _identCol.Attribute.MapType, 0) as OracleParameter; identParam.Direction = ParameterDirection.Output; sql = $"{sql} RETURNING {identColName} INTO {identParam.ParameterName}"; var dbParms = _params.Concat(new[] { identParam }).ToArray(); diff --git a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs index 4e4e7c8a..cd0d8f79 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs @@ -16,9 +16,10 @@ namespace FreeSql.Oracle { } - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; var dbtype = (OracleDbType)_orm.CodeFirst.GetDbInfo(type)?.type; if (dbtype == OracleDbType.Boolean) { @@ -26,6 +27,14 @@ namespace FreeSql.Oracle else value = (bool)value == true ? 1 : 0; dbtype = OracleDbType.Int16; } + else if (col != null && type == typeof(string)) + { + if (col.Attribute.DbType.Contains("NVARCHAR2")) dbtype = OracleDbType.NVarchar2; + else if (col.Attribute.DbType.Contains("VARCHAR2")) dbtype = OracleDbType.Varchar2; + else if (col.Attribute.DbType.Contains("NCHAR")) dbtype = OracleDbType.NChar; + else if (col.Attribute.DbType.Contains("CHAR")) dbtype = OracleDbType.Char; + else dbtype = OracleDbType.NVarchar2; + } var ret = new OracleParameter { ParameterName = QuoteParamterName(parameterName), OracleDbType = dbtype, Value = value }; _params?.Add(ret); return ret; diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs index 7f0ed104..b4556b31 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs @@ -13,6 +13,7 @@ using System.Net; using System.Text; using System.Linq.Expressions; using System.Reflection; +using FreeSql.Internal.Model; namespace FreeSql.PostgreSQL { @@ -78,16 +79,28 @@ namespace FreeSql.PostgreSQL return value; } - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; if (value != null) value = getParamterValue(type, value); var ret = new NpgsqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; //if (value.GetType().IsEnum || value.GetType().GenericTypeArguments.FirstOrDefault()?.IsEnum == true) { // ret.DataTypeName = ""; //} else { var tp = _orm.CodeFirst.GetDbInfo(type)?.type; - if (tp != null) ret.NpgsqlDbType = (NpgsqlDbType)tp.Value; + if (tp != null) + { + if (col != null && type == typeof(string)) + { + if (col.Attribute.DbType.Contains("VARCHAR")) ret.NpgsqlDbType = NpgsqlDbType.Varchar; + else if (col.Attribute.DbType.Contains("CHAR")) ret.NpgsqlDbType = NpgsqlDbType.Char; + else if (col.Attribute.DbType.Contains("TEXT")) ret.NpgsqlDbType = NpgsqlDbType.Text; + else ret.NpgsqlDbType = NpgsqlDbType.Varchar; + } + else + ret.NpgsqlDbType = (NpgsqlDbType)tp.Value; + } //} _params?.Add(ret); return ret; @@ -137,7 +150,7 @@ namespace FreeSql.PostgreSQL if (value == null) return "NULL"; if (_dicIsAssignableFromPostgisGeometry.GetOrAdd(type, t2 => typeof(PostgisGeometry).IsAssignableFrom(type.IsArray ? type.GetElementType() : type))) { - var pam = AppendParamter(specialParams, null, type, value); + var pam = AppendParamter(specialParams, null, null, type, value); return pam.ParameterName; } value = getParamterValue(type, value); diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs index e8b51ee5..beb264dd 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs @@ -1,4 +1,5 @@ using FreeSql.Internal; +using FreeSql.Internal.Model; using System; using System.Collections.Generic; using System.Data; @@ -21,13 +22,28 @@ namespace FreeSql.SqlServer public bool IsSqlServer2005 => ServerVersion == 9; public int ServerVersion = 0; - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; if (value?.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); var ret = new SqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; - if (tp != null) ret.SqlDbType = (SqlDbType)tp.Value; + if (tp != null) + { + if (col != null && type == typeof(string)) + { + if (col.Attribute.DbType.Contains("NVARCHAR")) ret.SqlDbType = SqlDbType.NVarChar; + else if (col.Attribute.DbType.Contains("VARCHAR")) ret.SqlDbType = SqlDbType.VarChar; + else if (col.Attribute.DbType.Contains("NCHAR")) ret.SqlDbType = SqlDbType.NChar; + else if (col.Attribute.DbType.Contains("CHAR")) ret.SqlDbType = SqlDbType.Char; + else if (col.Attribute.DbType.Contains("NTEXT")) ret.SqlDbType = SqlDbType.NText; + else if (col.Attribute.DbType.Contains("TEXT")) ret.SqlDbType = SqlDbType.Text; + else ret.SqlDbType = SqlDbType.VarChar; + } + else + ret.SqlDbType = (SqlDbType)tp.Value; + } _params?.Add(ret); return ret; } diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs index 9f862c74..aecfde24 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs @@ -16,9 +16,10 @@ namespace FreeSql.Sqlite { } - public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) + public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; + if (type == null && col != null) type = col.Attribute.MapType ?? col.CsType; var dbtype = (DbType)_orm.CodeFirst.GetDbInfo(type)?.type; switch (dbtype) {