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) {