diff --git a/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs b/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs index b1140ef8..2eda55a7 100644 --- a/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs +++ b/FreeSql.Tests/MySql/MySqlExpression/OtherTest.cs @@ -1,5 +1,6 @@ using FreeSql.DataAnnotations; using System; +using System.Collections.Generic; using System.Linq; using Xunit; @@ -24,6 +25,20 @@ namespace FreeSql.Tests.MySqlExpression { var sql1111 = select.Where(a => inarray.Contains(a.testFieldInt)).ToList(); var sql1122 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList(); var sql1133 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToList(); + + //in not in + var sql11111 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.testFieldInt)).ToList(); + var sql11222 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList(); + var sql11333 = select.Where(a => !new List() { 1, 2, 3 }.Contains(a.testFieldInt)).ToList(); + + var sql11111a = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt)).ToList(); + var sql11222b = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt) == false).ToList(); + var sql11333c = select.Where(a => !new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt)).ToList(); + + var inarray2 = new List() { 1, 2, 3 }; + var sql111111 = select.Where(a => inarray.Contains(a.testFieldInt)).ToList(); + var sql112222 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList(); + var sql113333 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToList(); } [Table(Name = "tb_alltype")] diff --git a/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs b/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs index 40c1545c..a9c428be 100644 --- a/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs +++ b/FreeSql.Tests/Oracle/OracleExpression/OtherTest.cs @@ -1,5 +1,6 @@ using FreeSql.DataAnnotations; using System; +using System.Collections.Generic; using System.Linq; using Xunit; @@ -23,6 +24,21 @@ namespace FreeSql.Tests.OracleExpression { var sql1111 = select.Where(a => inarray.Contains(a.Int)).ToList(); //var sql1122 = select.Where(a => inarray.Contains(a.Int) == false).ToList(); var sql1133 = select.Where(a => !inarray.Contains(a.Int)).ToList(); + + + //in not in + var sql11111 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.Int)).ToList(); + //var sql11222 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.Int) == false).ToList(); + var sql11333 = select.Where(a => !new List() { 1, 2, 3 }.Contains(a.Int)).ToList(); + + var sql11111a = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.Int)).ToList(); + //var sql11222b = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.Int) == false).ToList(); + var sql11333c = select.Where(a => !new List(new[] { 1, 2, 3 }).Contains(a.Int)).ToList(); + + var inarray2 = new List() { 1, 2, 3 }; + var sql111111 = select.Where(a => inarray.Contains(a.Int)).ToList(); + //var sql112222 = select.Where(a => inarray.Contains(a.Int) == false).ToList(); + var sql113333 = select.Where(a => !inarray.Contains(a.Int)).ToList(); } [Table(Name = "tb_alltype")] diff --git a/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs b/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs index 52be9d2f..54754ffd 100644 --- a/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs +++ b/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs @@ -37,6 +37,21 @@ namespace FreeSql.Tests.PostgreSQLExpression { var sql1122 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToSql(); var sql1133 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToSql(); + //in not in + var sql11111 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.testFieldInt)).ToList(); + var sql11222 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList(); + var sql11333 = select.Where(a => !new List() { 1, 2, 3 }.Contains(a.testFieldInt)).ToList(); + + var sql11111a = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt)).ToList(); + var sql11222b = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt) == false).ToList(); + var sql11333c = select.Where(a => !new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt)).ToList(); + + var inarray2 = new List() { 1, 2, 3 }; + var sql111111 = select.Where(a => inarray.Contains(a.testFieldInt)).ToList(); + var sql112222 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList(); + var sql113333 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToList(); + + var sql3 = select.Where(a => a.testFieldIntArray.Any()).ToList(); var sql4 = select.Where(a => a.testFieldIntArray.Any() == false).ToList(); diff --git a/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs b/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs index 9569273a..aeb695f0 100644 --- a/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs +++ b/FreeSql.Tests/SqlServer/SqlServerExpression/OtherTest.cs @@ -1,6 +1,7 @@ using FreeSql.DataAnnotations; using FreeSql.Tests.DataContext.SqlServer; using System; +using System.Collections.Generic; using System.Linq; using Xunit; @@ -28,6 +29,20 @@ namespace FreeSql.Tests.SqlServerExpression { var sql1111 = select.Where(a => inarray.Contains(a.testFieldInt)).ToList(); //var sql1122 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList(); var sql1133 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToList(); + + //in not in + var sql11111 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.testFieldInt)).ToList(); + //var sql11222 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList(); + var sql11333 = select.Where(a => !new List() { 1, 2, 3 }.Contains(a.testFieldInt)).ToList(); + + var sql11111a = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt)).ToList(); + //var sql11222b = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt) == false).ToList(); + var sql11333c = select.Where(a => !new List(new[] { 1, 2, 3 }).Contains(a.testFieldInt)).ToList(); + + var inarray2 = new List() { 1, 2, 3 }; + var sql111111 = select.Where(a => inarray.Contains(a.testFieldInt)).ToList(); + //var sql112222 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList(); + var sql113333 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToList(); } [Table(Name = "tb_alltype")] diff --git a/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs b/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs index b06812d4..c348ef36 100644 --- a/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs +++ b/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs @@ -1,5 +1,6 @@ using FreeSql.DataAnnotations; using System; +using System.Collections.Generic; using System.Linq; using Xunit; @@ -23,6 +24,20 @@ namespace FreeSql.Tests.SqliteExpression { var sql1111 = select.Where(a => inarray.Contains(a.Int)).ToList(); //var sql1122 = select.Where(a => inarray.Contains(a.Int) == false).ToList(); var sql1133 = select.Where(a => !inarray.Contains(a.Int)).ToList(); + + //in not in + var sql11111 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.Int)).ToList(); + //var sql11222 = select.Where(a => new List() { 1, 2, 3 }.Contains(a.Int) == false).ToList(); + var sql11333 = select.Where(a => !new List() { 1, 2, 3 }.Contains(a.Int)).ToList(); + + var sql11111a = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.Int)).ToList(); + //var sql11222b = select.Where(a => new List(new[] { 1, 2, 3 }).Contains(a.Int) == false).ToList(); + var sql11333c = select.Where(a => !new List(new[] { 1, 2, 3 }).Contains(a.Int)).ToList(); + + var inarray2 = new List() { 1, 2, 3 }; + var sql111111 = select.Where(a => inarray.Contains(a.Int)).ToList(); + //var sql112222 = select.Where(a => inarray.Contains(a.Int) == false).ToList(); + var sql113333 = select.Where(a => !inarray.Contains(a.Int)).ToList(); } [Table(Name = "tb_alltype")] diff --git a/FreeSql/MySql/MySqlExpression.cs b/FreeSql/MySql/MySqlExpression.cs index 03db162e..30eee006 100644 --- a/FreeSql/MySql/MySqlExpression.cs +++ b/FreeSql/MySql/MySqlExpression.cs @@ -1,6 +1,7 @@ using FreeSql.Internal; using FreeSql.Internal.Model; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; @@ -21,7 +22,7 @@ namespace FreeSql.MySql { if (objType?.FullName == "System.Byte[]") return null; var argIndex = 0; - if (objType == null && callExp.Method.DeclaringType.FullName == typeof(Enumerable).FullName) { + if (objType == null && callExp.Method.DeclaringType == typeof(Enumerable)) { objExp = callExp.Arguments.FirstOrDefault(); objType = objExp?.Type; argIndex++; @@ -29,7 +30,7 @@ namespace FreeSql.MySql { if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null) { var left = objExp == null ? null : getExp(objExp); - if (objType.IsArray == true) { + if (objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) { switch (callExp.Method.Name) { case "Contains": //判断 in @@ -46,7 +47,27 @@ namespace FreeSql.MySql { if (a > 0) arrSb.Append(","); arrSb.Append(getExp(arrExp.Expressions[a])); } + if (arrSb.Length == 1) arrSb.Append("NULL"); return arrSb.Append(")").ToString(); + case ExpressionType.ListInit: + var listExp = exp as ListInitExpression; + var listSb = new StringBuilder(); + listSb.Append("("); + for (var a = 0; a < listExp.Initializers.Count; a++) { + if (listExp.Initializers[a].Arguments.Any() == false) continue; + if (a > 0) listSb.Append(","); + listSb.Append(getExp(listExp.Initializers[a].Arguments.FirstOrDefault())); + } + if (listSb.Length == 1) listSb.Append("NULL"); + return listSb.Append(")").ToString(); + case ExpressionType.New: + var newExp = exp as NewExpression; + if (typeof(IList).IsAssignableFrom(newExp.Type)) { + if (newExp.Arguments.Count == 0) return "(NULL)"; + if (typeof(IEnumerable).IsAssignableFrom(newExp.Arguments[0].Type) == false) return "(NULL)"; + return getExp(newExp.Arguments[0]); + } + return null; } return null; } diff --git a/FreeSql/Oracle/OracleExpression.cs b/FreeSql/Oracle/OracleExpression.cs index de021ad6..d2f7a03e 100644 --- a/FreeSql/Oracle/OracleExpression.cs +++ b/FreeSql/Oracle/OracleExpression.cs @@ -1,6 +1,7 @@ using FreeSql.Internal; using FreeSql.Internal.Model; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; @@ -21,7 +22,7 @@ namespace FreeSql.Oracle { if (objType?.FullName == "System.Byte[]") return null; var argIndex = 0; - if (objType == null && callExp.Method.DeclaringType.FullName == typeof(Enumerable).FullName) { + if (objType == null && callExp.Method.DeclaringType == typeof(Enumerable)) { objExp = callExp.Arguments.FirstOrDefault(); objType = objExp?.Type; argIndex++; @@ -29,7 +30,7 @@ namespace FreeSql.Oracle { if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null) { var left = objExp == null ? null : getExp(objExp); - if (objType.IsArray == true) { + if (objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) { switch (callExp.Method.Name) { case "Contains": //判断 in @@ -46,7 +47,27 @@ namespace FreeSql.Oracle { if (a > 0) arrSb.Append(","); arrSb.Append(getExp(arrExp.Expressions[a])); } + if (arrSb.Length == 1) arrSb.Append("NULL"); return arrSb.Append(")").ToString(); + case ExpressionType.ListInit: + var listExp = exp as ListInitExpression; + var listSb = new StringBuilder(); + listSb.Append("("); + for (var a = 0; a < listExp.Initializers.Count; a++) { + if (listExp.Initializers[a].Arguments.Any() == false) continue; + if (a > 0) listSb.Append(","); + listSb.Append(getExp(listExp.Initializers[a].Arguments.FirstOrDefault())); + } + if (listSb.Length == 1) listSb.Append("NULL"); + return listSb.Append(")").ToString(); + case ExpressionType.New: + var newExp = exp as NewExpression; + if (typeof(IList).IsAssignableFrom(newExp.Type)) { + if (newExp.Arguments.Count == 0) return "(NULL)"; + if (typeof(IEnumerable).IsAssignableFrom(newExp.Arguments[0].Type) == false) return "(NULL)"; + return getExp(newExp.Arguments[0]); + } + return null; } return null; } diff --git a/FreeSql/PostgreSQL/PostgreSQLExpression.cs b/FreeSql/PostgreSQL/PostgreSQLExpression.cs index 9f21568d..84372fb7 100644 --- a/FreeSql/PostgreSQL/PostgreSQLExpression.cs +++ b/FreeSql/PostgreSQL/PostgreSQLExpression.cs @@ -2,6 +2,7 @@ using FreeSql.Internal.Model; using Newtonsoft.Json.Linq; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; @@ -26,7 +27,7 @@ namespace FreeSql.PostgreSQL { if (objType?.FullName == "System.Byte[]") return null; var argIndex = 0; - if (objType == null && callExp.Method.DeclaringType.FullName == typeof(Enumerable).FullName) { + if (objType == null && callExp.Method.DeclaringType == typeof(Enumerable)) { objExp = callExp.Arguments.FirstOrDefault(); objType = objExp?.Type; argIndex++; @@ -34,7 +35,7 @@ namespace FreeSql.PostgreSQL { if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null) { var left = objExp == null ? null : getExp(objExp); - if (objType.IsArray == true) { + if (objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) { switch (callExp.Method.Name) { case "Any": if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]"; @@ -141,7 +142,27 @@ namespace FreeSql.PostgreSQL { if (a > 0) arrSb.Append(","); arrSb.Append(getExp(arrExp.Expressions[a])); } + if (arrSb.Length == 1) arrSb.Append("NULL"); return arrSb.Append("]").ToString(); + case ExpressionType.ListInit: + var listExp = exp as ListInitExpression; + var listSb = new StringBuilder(); + listSb.Append("("); + for (var a = 0; a < listExp.Initializers.Count; a++) { + if (listExp.Initializers[a].Arguments.Any() == false) continue; + if (a > 0) listSb.Append(","); + listSb.Append(getExp(listExp.Initializers[a].Arguments.FirstOrDefault())); + } + if (listSb.Length == 1) listSb.Append("NULL"); + return listSb.Append(")").ToString(); + case ExpressionType.New: + var newExp = exp as NewExpression; + if (typeof(IList).IsAssignableFrom(newExp.Type)) { + if (newExp.Arguments.Count == 0) return "(NULL)"; + if (typeof(IEnumerable).IsAssignableFrom(newExp.Arguments[0].Type) == false) return "(NULL)"; + return getExp(newExp.Arguments[0]); + } + return null; } return null; } diff --git a/FreeSql/SqlServer/SqlServerExpression.cs b/FreeSql/SqlServer/SqlServerExpression.cs index c357a543..39c3eef8 100644 --- a/FreeSql/SqlServer/SqlServerExpression.cs +++ b/FreeSql/SqlServer/SqlServerExpression.cs @@ -1,6 +1,7 @@ using FreeSql.Internal; using FreeSql.Internal.Model; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; @@ -21,7 +22,7 @@ namespace FreeSql.SqlServer { if (objType?.FullName == "System.Byte[]") return null; var argIndex = 0; - if (objType == null && callExp.Method.DeclaringType.FullName == typeof(Enumerable).FullName) { + if (objType == null && callExp.Method.DeclaringType == typeof(Enumerable)) { objExp = callExp.Arguments.FirstOrDefault(); objType = objExp?.Type; argIndex++; @@ -29,7 +30,7 @@ namespace FreeSql.SqlServer { if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null) { var left = objExp == null ? null : getExp(objExp); - if (objType.IsArray == true) { + if (objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) { switch (callExp.Method.Name) { case "Contains": //判断 in @@ -46,7 +47,27 @@ namespace FreeSql.SqlServer { if (a > 0) arrSb.Append(","); arrSb.Append(getExp(arrExp.Expressions[a])); } + if (arrSb.Length == 1) arrSb.Append("NULL"); return arrSb.Append(")").ToString(); + case ExpressionType.ListInit: + var listExp = exp as ListInitExpression; + var listSb = new StringBuilder(); + listSb.Append("("); + for (var a = 0; a < listExp.Initializers.Count; a++) { + if (listExp.Initializers[a].Arguments.Any() == false) continue; + if (a > 0) listSb.Append(","); + listSb.Append(getExp(listExp.Initializers[a].Arguments.FirstOrDefault())); + } + if (listSb.Length == 1) listSb.Append("NULL"); + return listSb.Append(")").ToString(); + case ExpressionType.New: + var newExp = exp as NewExpression; + if (typeof(IList).IsAssignableFrom(newExp.Type)) { + if (newExp.Arguments.Count == 0) return "(NULL)"; + if (typeof(IEnumerable).IsAssignableFrom(newExp.Arguments[0].Type) == false) return "(NULL)"; + return getExp(newExp.Arguments[0]); + } + return null; } return null; } diff --git a/FreeSql/Sqlite/SqliteExpression.cs b/FreeSql/Sqlite/SqliteExpression.cs index 62229156..ff1e40a1 100644 --- a/FreeSql/Sqlite/SqliteExpression.cs +++ b/FreeSql/Sqlite/SqliteExpression.cs @@ -1,6 +1,7 @@ using FreeSql.Internal; using FreeSql.Internal.Model; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; @@ -21,7 +22,7 @@ namespace FreeSql.Sqlite { if (objType?.FullName == "System.Byte[]") return null; var argIndex = 0; - if (objType == null && callExp.Method.DeclaringType.FullName == typeof(Enumerable).FullName) { + if (objType == null && callExp.Method.DeclaringType == typeof(Enumerable)) { objExp = callExp.Arguments.FirstOrDefault(); objType = objExp?.Type; argIndex++; @@ -29,7 +30,7 @@ namespace FreeSql.Sqlite { if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null) { var left = objExp == null ? null : getExp(objExp); - if (objType.IsArray == true) { + if (objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) { switch (callExp.Method.Name) { case "Contains": //判断 in @@ -46,7 +47,27 @@ namespace FreeSql.Sqlite { if (a > 0) arrSb.Append(","); arrSb.Append(getExp(arrExp.Expressions[a])); } + if (arrSb.Length == 1) arrSb.Append("NULL"); return arrSb.Append(")").ToString(); + case ExpressionType.ListInit: + var listExp = exp as ListInitExpression; + var listSb = new StringBuilder(); + listSb.Append("("); + for (var a = 0; a < listExp.Initializers.Count; a++) { + if (listExp.Initializers[a].Arguments.Any() == false) continue; + if (a > 0) listSb.Append(","); + listSb.Append(getExp(listExp.Initializers[a].Arguments.FirstOrDefault())); + } + if (listSb.Length == 1) listSb.Append("NULL"); + return listSb.Append(")").ToString(); + case ExpressionType.New: + var newExp = exp as NewExpression; + if (typeof(IList).IsAssignableFrom(newExp.Type)) { + if (newExp.Arguments.Count == 0) return "(NULL)"; + if (typeof(IEnumerable).IsAssignableFrom(newExp.Arguments[0].Type) == false) return "(NULL)"; + return getExp(newExp.Arguments[0]); + } + return null; } return null; }