From eabe1decb8773b319f02f9ac507296c8281d108b Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 1 Jun 2022 15:27:35 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20UseCommandParameterWit?= =?UTF-8?q?hLambda=20IN=20=E5=8F=82=E6=95=B0=E5=8C=96=E5=88=A4=E6=96=AD=20?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=20bug=EF=BC=9B#1137?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/Issues/1137.cs | 109 +++++++++++++++++++++ FreeSql/Internal/CommonExpression.cs | 8 ++ 2 files changed, 117 insertions(+) create mode 100644 FreeSql.Tests/FreeSql.Tests/Issues/1137.cs diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/1137.cs b/FreeSql.Tests/FreeSql.Tests/Issues/1137.cs new file mode 100644 index 00000000..6086f862 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Issues/1137.cs @@ -0,0 +1,109 @@ +using System.Collections.Generic; +using Xunit; + +namespace FreeSql.Tests.Issues +{ + public class _1137 + { + [Fact] + public void ListContains() + { + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.Sqlite, "data source=:memory:") + .UseGenerateCommandParameterWithLambda(true) + .Build()) + { + fsql.Aop.ConfigEntityProperty += (s, e) => + { + if (e.Property.PropertyType.IsEnum) + e.ModifyResult.MapType = typeof(int); + }; + var listEnum = new List { UserType.Client }; + var sql = fsql.Select().Where(a => listEnum.Contains(a.Type)).ToSql(a => a); + Assert.Equal(@"SELECT a.""Type"" as1 +FROM ""User"" a +WHERE (((a.""Type"") in (1)))", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.Sqlite, "data source=:memory:") + .UseGenerateCommandParameterWithLambda(true) + .Build()) + { + fsql.CodeFirst.ConfigEntity(a => { }); + fsql.Aop.ConfigEntityProperty += (s, e) => + { + if (e.Property.PropertyType.IsEnum) + e.ModifyResult.MapType = typeof(string); + }; + var listEnum = new List { UserType.Client }; + var sql = fsql.Select().Where(a => listEnum.Contains(a.Type)).ToSql(a => a); + Assert.Equal(@"SELECT a.""Type"" as1 +FROM ""User"" a +WHERE (((a.""Type"") in ('Client')))", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=5;Allow User Variables=True") + .UseGenerateCommandParameterWithLambda(true) + .Build()) + { + fsql.CodeFirst.Entity(a => a.ToTable("issues1137_user")); + var listEnum = new List { UserType.Client }; + var sql = fsql.Select().Where(a => listEnum.Contains(a.Type)).ToSql(a => a); + Assert.Equal(@"SELECT a.`Type` as1 +FROM `issues1137_user` a +WHERE (((a.`Type`) in ('Client')))", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=5;Allow User Variables=True") + .UseGenerateCommandParameterWithLambda(true) + .Build()) + { + fsql.CodeFirst.Entity(a => a.ToTable("issues1137_user")); + fsql.Aop.ConfigEntityProperty += (s, e) => + { + if (e.Property.PropertyType.IsEnum) + e.ModifyResult.MapType = typeof(int); + }; + var listEnum = new List { UserType.Client }; + var sql = fsql.Select().Where(a => listEnum.Contains(a.Type)).ToSql(a => a); + Assert.Equal(@"SELECT a.`Type` as1 +FROM `issues1137_user` a +WHERE (((a.`Type`) in (1)))", sql); + } + + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=5;Allow User Variables=True") + .UseGenerateCommandParameterWithLambda(true) + .Build()) + { + fsql.CodeFirst.Entity(a => a.ToTable("issues1137_user")); + fsql.Aop.ConfigEntityProperty += (s, e) => + { + if (e.Property.PropertyType.IsEnum) + e.ModifyResult.MapType = typeof(string); + }; + var listEnum = new List { UserType.Client }; + var sql = fsql.Select().Where(a => listEnum.Contains(a.Type)).ToSql(a => a); + Assert.Equal(@"SELECT a.`Type` as1 +FROM `issues1137_user` a +WHERE (((a.`Type`) in ('Client')))", sql); + } + } + + public enum UserType + { + Client = 1, + Internal = 2 + } + public class User + { + public UserType Type { get; set; } + } + + + } + +} diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 72815953..1146d0b3 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -2058,6 +2058,14 @@ namespace FreeSql.Internal if (_common.CodeFirst.IsGenerateCommandParameterWithLambda && dbParams != null) { if (obj == null) return "NULL"; + if (mapColumn != null) + { + var objType = obj.GetType(); + if (obj is ICollection && objType.GetGenericArguments().FirstOrDefault()?.NullableTypeOrThis() == mapColumn.CsType?.NullableTypeOrThis()) + return string.Format(CultureInfo.InvariantCulture, "{0}", _ado.AddslashesProcessParam(obj, mapType, mapColumn)); + if (obj is Array && objType.GetElementType()?.NullableTypeOrThis() == mapColumn.CsType?.NullableTypeOrThis()) + return string.Format(CultureInfo.InvariantCulture, "{0}", _ado.AddslashesProcessParam(obj, mapType, mapColumn)); + } var type = mapType ?? mapColumn?.Attribute.MapType ?? obj?.GetType(); if (_common.CodeFirst.GetDbInfo(type) != null) {