mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 补充 Expression IEnumerable<T>.Contains 的支持,之前只能数组或IList<T>;
This commit is contained in:
parent
169cf596c0
commit
205421f7e0
@ -21,6 +21,9 @@ namespace FreeSql.Tests.MySqlExpression {
|
|||||||
Assert.Throws<MySqlException>(() => { select.Where(a => nullarr.Contains(a.testFieldInt)).ToList(); });
|
Assert.Throws<MySqlException>(() => { select.Where(a => nullarr.Contains(a.testFieldInt)).ToList(); });
|
||||||
Assert.Throws<MySqlException>(() => { select.Where(a => new int[0].Contains(a.testFieldInt)).ToList(); });
|
Assert.Throws<MySqlException>(() => { select.Where(a => new int[0].Contains(a.testFieldInt)).ToList(); });
|
||||||
|
|
||||||
|
IEnumerable<int> testlinqlist = new List<int>(new[] { 1, 2, 3 });
|
||||||
|
var testlinq = select.Where(a => testlinqlist.Contains(a.testFieldInt)).ToList();
|
||||||
|
|
||||||
//in not in
|
//in not in
|
||||||
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToList();
|
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToList();
|
||||||
var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList();
|
var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList();
|
||||||
|
@ -15,6 +15,9 @@ namespace FreeSql.Tests.OracleExpression {
|
|||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Array() {
|
public void Array() {
|
||||||
|
IEnumerable<int> testlinqlist = new List<int>(new[] { 1, 2, 3 });
|
||||||
|
var testlinq = select.Where(a => testlinqlist.Contains(a.Int)).ToList();
|
||||||
|
|
||||||
//in not in
|
//in not in
|
||||||
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int)).ToList();
|
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int)).ToList();
|
||||||
//var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int) == false).ToList();
|
//var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int) == false).ToList();
|
||||||
|
@ -23,6 +23,8 @@ namespace FreeSql.Tests.PostgreSQLExpression {
|
|||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Array() {
|
public void Array() {
|
||||||
|
IEnumerable<int> testlinqlist = new List<int>(new[] { 1, 2, 3 });
|
||||||
|
var testlinq = select.Where(a => testlinqlist.Contains(a.testFieldInt)).ToList();
|
||||||
|
|
||||||
var sql1 = select.Where(a => a.testFieldIntArray.Contains(1)).ToList();
|
var sql1 = select.Where(a => a.testFieldIntArray.Contains(1)).ToList();
|
||||||
var sql2 = select.Where(a => a.testFieldIntArray.Contains(1) == false).ToList();
|
var sql2 = select.Where(a => a.testFieldIntArray.Contains(1) == false).ToList();
|
||||||
|
@ -20,6 +20,9 @@ namespace FreeSql.Tests.SqlServerExpression {
|
|||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Array() {
|
public void Array() {
|
||||||
|
IEnumerable<int> testlinqlist = new List<int>(new[] { 1, 2, 3 });
|
||||||
|
var testlinq = select.Where(a => testlinqlist.Contains(a.testFieldInt)).ToList();
|
||||||
|
|
||||||
//in not in
|
//in not in
|
||||||
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToList();
|
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt)).ToList();
|
||||||
//var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList();
|
//var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.testFieldInt) == false).ToList();
|
||||||
|
@ -15,6 +15,9 @@ namespace FreeSql.Tests.SqliteExpression {
|
|||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Array() {
|
public void Array() {
|
||||||
|
IEnumerable<int> testlinqlist = new List<int>(new[] { 1, 2, 3 });
|
||||||
|
var testlinq = select.Where(a => testlinqlist.Contains(a.Int)).ToList();
|
||||||
|
|
||||||
//in not in
|
//in not in
|
||||||
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int)).ToList();
|
var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int)).ToList();
|
||||||
//var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int) == false).ToList();
|
//var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int) == false).ToList();
|
||||||
|
@ -42,5 +42,10 @@ namespace FreeSql.DataAnnotations {
|
|||||||
/// 数据库默认值
|
/// 数据库默认值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal object DbDefautValue { get; set; }
|
internal object DbDefautValue { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 类型映射,比如:可将 enum 属性映射成 typeof(string)
|
||||||
|
/// </summary>
|
||||||
|
public Type Mapping { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -90,14 +90,12 @@ namespace FreeSql.MySql {
|
|||||||
argIndex++;
|
argIndex++;
|
||||||
}
|
}
|
||||||
if (objType == null) objType = callExp.Method.DeclaringType;
|
if (objType == null) objType = callExp.Method.DeclaringType;
|
||||||
if (objType != null) {
|
if (objType != null || objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) {
|
||||||
var left = objExp == null ? null : getExp(objExp);
|
var left = objExp == null ? null : getExp(objExp);
|
||||||
if (objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) {
|
switch (callExp.Method.Name) {
|
||||||
switch (callExp.Method.Name) {
|
case "Contains":
|
||||||
case "Contains":
|
//判断 in
|
||||||
//判断 in
|
return $"({getExp(callExp.Arguments[argIndex])}) in {left}";
|
||||||
return $"({getExp(callExp.Arguments[argIndex])}) in {left}";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -90,14 +90,12 @@ namespace FreeSql.Oracle {
|
|||||||
argIndex++;
|
argIndex++;
|
||||||
}
|
}
|
||||||
if (objType == null) objType = callExp.Method.DeclaringType;
|
if (objType == null) objType = callExp.Method.DeclaringType;
|
||||||
if (objType != null) {
|
if (objType != null || objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) {
|
||||||
var left = objExp == null ? null : getExp(objExp);
|
var left = objExp == null ? null : getExp(objExp);
|
||||||
if (objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) {
|
switch (callExp.Method.Name) {
|
||||||
switch (callExp.Method.Name) {
|
case "Contains":
|
||||||
case "Contains":
|
//判断 in
|
||||||
//判断 in
|
return $"({getExp(callExp.Arguments[argIndex])}) in {left}";
|
||||||
return $"({getExp(callExp.Arguments[argIndex])}) in {left}";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -95,7 +95,7 @@ namespace FreeSql.PostgreSQL {
|
|||||||
argIndex++;
|
argIndex++;
|
||||||
}
|
}
|
||||||
if (objType == null) objType = callExp.Method.DeclaringType;
|
if (objType == null) objType = callExp.Method.DeclaringType;
|
||||||
if (objType != null) {
|
if (objType != null || objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) {
|
||||||
var left = objExp == null ? null : getExp(objExp);
|
var left = objExp == null ? null : getExp(objExp);
|
||||||
switch (objType.FullName) {
|
switch (objType.FullName) {
|
||||||
case "Newtonsoft.Json.Linq.JToken":
|
case "Newtonsoft.Json.Linq.JToken":
|
||||||
@ -134,32 +134,30 @@ namespace FreeSql.PostgreSQL {
|
|||||||
case "Values": return $"avals({left})";
|
case "Values": return $"avals({left})";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) {
|
switch (callExp.Method.Name) {
|
||||||
switch (callExp.Method.Name) {
|
case "Any":
|
||||||
case "Any":
|
if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]";
|
||||||
if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]";
|
return $"(case when {left} is null then 0 else array_length({left},1) end > 0)";
|
||||||
return $"(case when {left} is null then 0 else array_length({left},1) end > 0)";
|
case "Contains":
|
||||||
case "Contains":
|
//判断 in 或 array @> array
|
||||||
//判断 in 或 array @> array
|
var right1 = getExp(callExp.Arguments[argIndex]);
|
||||||
var right1 = getExp(callExp.Arguments[argIndex]);
|
if (left.StartsWith("array[") || left.EndsWith("]"))
|
||||||
if (left.StartsWith("array[") || left.EndsWith("]"))
|
return $"{right1} in ({left.Substring(6, left.Length - 7)})";
|
||||||
return $"{right1} in ({left.Substring(6, left.Length - 7)})";
|
if (left.StartsWith("(") || left.EndsWith(")"))
|
||||||
if (left.StartsWith("(") || left.EndsWith(")"))
|
return $"{right1} in {left}";
|
||||||
return $"{right1} in {left}";
|
if (right1.StartsWith("(") || right1.EndsWith(")")) right1 = $"array[{right1.TrimStart('(').TrimEnd(')')}]";
|
||||||
if (right1.StartsWith("(") || right1.EndsWith(")")) right1 = $"array[{right1.TrimStart('(').TrimEnd(')')}]";
|
return $"({left} @> array[{right1}])";
|
||||||
return $"({left} @> array[{right1}])";
|
case "Concat":
|
||||||
case "Concat":
|
if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]";
|
||||||
if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]";
|
var right2 = getExp(callExp.Arguments[argIndex]);
|
||||||
var right2 = getExp(callExp.Arguments[argIndex]);
|
if (right2.StartsWith("(") || right2.EndsWith(")")) right2 = $"array[{right2.TrimStart('(').TrimEnd(')')}]";
|
||||||
if (right2.StartsWith("(") || right2.EndsWith(")")) right2 = $"array[{right2.TrimStart('(').TrimEnd(')')}]";
|
return $"({left} || {right2})";
|
||||||
return $"({left} || {right2})";
|
case "GetLength":
|
||||||
case "GetLength":
|
case "GetLongLength":
|
||||||
case "GetLongLength":
|
case "Length":
|
||||||
case "Length":
|
case "Count":
|
||||||
case "Count":
|
if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]";
|
||||||
if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]";
|
return $"case when {left} is null then 0 else array_length({left},1) end";
|
||||||
return $"case when {left} is null then 0 else array_length({left},1) end";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -93,14 +93,12 @@ namespace FreeSql.SqlServer {
|
|||||||
argIndex++;
|
argIndex++;
|
||||||
}
|
}
|
||||||
if (objType == null) objType = callExp.Method.DeclaringType;
|
if (objType == null) objType = callExp.Method.DeclaringType;
|
||||||
if (objType != null) {
|
if (objType != null || objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) {
|
||||||
var left = objExp == null ? null : getExp(objExp);
|
var left = objExp == null ? null : getExp(objExp);
|
||||||
if (objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) {
|
switch (callExp.Method.Name) {
|
||||||
switch (callExp.Method.Name) {
|
case "Contains":
|
||||||
case "Contains":
|
//判断 in
|
||||||
//判断 in
|
return $"({getExp(callExp.Arguments[argIndex])}) in {left}";
|
||||||
return $"({getExp(callExp.Arguments[argIndex])}) in {left}";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -90,14 +90,12 @@ namespace FreeSql.Sqlite {
|
|||||||
argIndex++;
|
argIndex++;
|
||||||
}
|
}
|
||||||
if (objType == null) objType = callExp.Method.DeclaringType;
|
if (objType == null) objType = callExp.Method.DeclaringType;
|
||||||
if (objType != null) {
|
if (objType != null || objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) {
|
||||||
var left = objExp == null ? null : getExp(objExp);
|
var left = objExp == null ? null : getExp(objExp);
|
||||||
if (objType.IsArray || typeof(IList).IsAssignableFrom(callExp.Method.DeclaringType)) {
|
switch (callExp.Method.Name) {
|
||||||
switch (callExp.Method.Name) {
|
case "Contains":
|
||||||
case "Contains":
|
//判断 in
|
||||||
//判断 in
|
return $"({getExp(callExp.Arguments[argIndex])}) in {left}";
|
||||||
return $"({getExp(callExp.Arguments[argIndex])}) in {left}";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user