From 454eb8cc44a1eaa04b4822c31ce6eaa4551b423b Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Sat, 31 Oct 2020 07:03:00 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20=E8=A1=A8=E8=BE=BE?=
=?UTF-8?q?=E5=BC=8F=E6=A0=91=E5=87=BD=E6=95=B0=E8=A7=A3=E6=9E=90=20byte[]?=
=?UTF-8?q?=20Length=EF=BC=9B#505?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 80 +++++++++
FreeSql.Tests/FreeSql.Tests/Issues/505.cs | 52 ++++++
FreeSql.Tests/FreeSql.Tests/Issues/507.cs | 163 ++++++++++++++++++
.../DamengExpression.cs | 4 +
.../FirebirdExpression.cs | 4 +
.../KingbaseESExpression.cs | 10 +-
.../MsAccessExpression.cs | 4 +
.../FreeSql.Provider.MySql/MySqlExpression.cs | 4 +
.../Dameng/OdbcDamengExpression.cs | 4 +
.../KingbaseES/OdbcKingbaseESExpression.cs | 10 +-
.../MySql/OdbcMySqlExpression.cs | 4 +
.../Oracle/OdbcOracleExpression.cs | 4 +
.../PostgreSQL/OdbcPostgreSQLExpression.cs | 10 +-
.../SqlServer/OdbcSqlServerExpression.cs | 4 +
.../OracleExpression.cs | 4 +
.../PostgreSQLExpression.cs | 10 +-
.../ShenTongExpression.cs | 10 +-
.../SqlServerExpression.cs | 4 +
.../SqliteExpression.cs | 4 +
19 files changed, 369 insertions(+), 20 deletions(-)
create mode 100644 FreeSql.Tests/FreeSql.Tests/Issues/505.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Issues/507.cs
diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml
index c482a1d3..bf9e6d4d 100644
--- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml
+++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml
@@ -24,6 +24,86 @@
支付Id
+
+
+ 班期标识-BodyScheduleEntity班期主键
+
+
+
+
+ 姓名
+
+
+
+
+ 出生日期
+
+
+
+
+ 身份证
+
+
+
+
+ 联系电话
+
+
+
+
+ 学校名称
+
+
+
+
+ 初潮年龄
+
+
+
+
+ 联系地址
+
+
+
+
+ 审核人标识
+
+
+
+
+ 审核人
+
+
+
+
+ 审核时间
+
+
+
+
+ 拒绝原因
+
+
+
+
+ 采集时间
+
+
+
+
+ 附件标识(多附件)
+
+
+
+
+ 性别
+
+
+
+
+ 班期信息
+
+
保存或添加,如果主键有值则尝试 Update,如果影响的行为 0 则尝试 Insert
diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/505.cs b/FreeSql.Tests/FreeSql.Tests/Issues/505.cs
new file mode 100644
index 00000000..9a12b9ac
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/Issues/505.cs
@@ -0,0 +1,52 @@
+using FreeSql.DataAnnotations;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text;
+using System.Threading;
+using Xunit;
+
+namespace FreeSql.Tests.Issues
+{
+ public class _505
+ {
+ [Fact]
+ public void ByteLengthTest()
+ {
+ TestLocal(g.sqlserver);
+ TestLocal(g.mysql);
+ TestLocal(g.pgsql);
+ TestLocal(g.oracle);
+ TestLocal(g.sqlite);
+ TestLocal(g.firebird);
+ TestLocal(g.dameng);
+ //TestLocal(g.kingbaseES); //
+ //TestLocal(g.shentong); // OCTET_LENGTH(xx) 返回结果32,值不符合
+ //TestLocal(g.msaccess); //lenb(xx) 返回结果 15,值不符合
+
+ void TestLocal(IFreeSql fsql)
+ {
+ var byteArray = Encoding.UTF8.GetBytes("我是中国人");
+ fsql.Delete().Where("1=1").ExecuteAffrows();
+ fsql.Insert(new Model505 { ByteLength = byteArray.Length, ByteArray = byteArray }).ExecuteAffrows();
+
+ var item = fsql.Select()
+ //.Where(x => x.ByteArray.Length == x.ByteLength)
+ .First(a => new { item = a, length = a.ByteArray.Length });
+
+ Assert.NotNull(item);
+ Assert.Equal(Encoding.UTF8.GetString(byteArray), Encoding.UTF8.GetString(item.item.ByteArray));
+ Assert.Equal(byteArray.Length, item.item.ByteLength);
+ Assert.Equal(byteArray.Length, item.length);
+ }
+ }
+ public class Model505
+ {
+ public Guid id { get; set; }
+ public byte[] ByteArray { get; set; }
+ public int ByteLength { get; set; }
+ }
+
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/507.cs b/FreeSql.Tests/FreeSql.Tests/Issues/507.cs
new file mode 100644
index 00000000..83884472
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/Issues/507.cs
@@ -0,0 +1,163 @@
+using FreeSql.DataAnnotations;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text;
+using System.Threading;
+using Xunit;
+
+namespace FreeSql.Tests.Issues
+{
+ public class _507
+ {
+ [Fact]
+ public void SelectTest()
+ {
+ var fsql = g.sqlite;
+ var _bodyAuditRepository = fsql.GetRepository();
+
+ var sql = _bodyAuditRepository.Select
+ .Include(a => a.ClassInfo)
+ .Count(out var total)
+ .OrderBy(true, a => a.ClassInfo.period)
+ .OrderBy(true, a => a.ClassInfo.className)
+ .Page(2, 10)
+ .ToList();
+ }
+ public class BodyAuditEntity
+ {
+ public string Id { get; set; }
+
+ ///
+ /// 班期标识-BodyScheduleEntity班期主键
+ ///
+ [Column(Name = "ClassId", StringLength = 70, Position = 2)]
+ public string ClassId { get; set; }
+
+ ///
+ /// 姓名
+ ///
+ [Column(Name = "Name", StringLength = 20, Position = 3)]
+ public string Name { get; set; }
+
+
+
+ ///
+ /// 出生日期
+ ///
+ [Column(Name = "Birthday", StringLength = 20, Position = 5)]
+ public string Birthday { get; set; }
+
+ ///
+ /// 身份证
+ ///
+ [Column(Name = "IdCard", StringLength = 20, Position = 6)]
+ public string IdCard { get; set; }
+
+ ///
+ /// 联系电话
+ ///
+ [Column(Name = "TelPhone", StringLength = 15, Position = 7)]
+ public string TelPhone { get; set; }
+
+ ///
+ /// 学校名称
+ ///
+ [Column(Name = "SchoolName", StringLength = 50, Position = 8)]
+ public string SchoolName { get; set; }
+
+ ///
+ /// 初潮年龄
+ ///
+ [Column(Name = "StuCCNL", StringLength = 20, Position = 9)]
+ public int? StuCCNL { get; set; }
+
+ ///
+ /// 联系地址
+ ///
+ [Column(Name = "Address", StringLength = 100, Position = 10)]
+ public string Address { get; set; }
+
+ ///
+ /// 审核人标识
+ ///
+ [Column(Name = "CheckUserId", StringLength = 70)]
+ public string CheckUserId { get; set; }
+
+ ///
+ /// 审核人
+ ///
+ [Column(Name = "CheckUserName", StringLength = 20)]
+ public string CheckUserName { get; set; }
+
+ ///
+ /// 审核时间
+ ///
+ [Column(Name = "CheckTime")]
+ public DateTime? CheckTime { get; set; }
+
+ ///
+ /// 拒绝原因
+ ///
+ [Column(Name = "RefuseReason", StringLength = 100)]
+ public string RefuseReason { get; set; }
+
+ ///
+ /// 采集时间
+ ///
+ [Column(Name = "CollectionDate")]
+ public DateTime? CollectionDate { get; set; }
+
+ ///
+ /// 附件标识(多附件)
+ ///
+ [Column(Name = "AttachmentId", StringLength = 500)]
+ public string AttachmentId { get; set; }
+
+ ///
+ /// 性别
+ ///
+ [Column(Name = "Sex", StringLength = 2, Position = 4)]
+ public string Sex { get; set; }
+
+ #region 导航属性
+ ///
+ /// 班期信息
+ ///
+ [Navigate(nameof(ClassId))]
+ public virtual BodyScheduleEntity ClassInfo { get; set; }
+ #endregion
+ }
+ public class BodyScheduleEntity
+ {
+ public string Id { get; set; }
+
+ [Column(Name = "period")]
+ public int? period { get; set; }
+
+ [Column(Name = "maxQuota")]
+ public int? maxQuota { get; set; }
+
+ [Column(Name = "allDays")]
+ public int? allDays { get; set; }
+
+ [Column(Name = "schoolId", StringLength = 64)]
+ public string bodySchoolId { get; set; }
+
+ [Column(Name = "ownership", StringLength = 64)]
+ public string ownership { get; set; }
+
+
+ [Column(Name = "className", StringLength = 20)]
+ public string className { get; set; }
+
+ [Column(Name = "sex", StringLength = 10)]
+ public string sex { get; set; }
+
+ [Column(Name = "classType", StringLength = 20)]
+ public string classType { get; set; }
+ }
+
+ }
+}
diff --git a/Providers/FreeSql.Provider.Dameng/DamengExpression.cs b/Providers/FreeSql.Provider.Dameng/DamengExpression.cs
index acc956e9..e97e9c88 100644
--- a/Providers/FreeSql.Provider.Dameng/DamengExpression.cs
+++ b/Providers/FreeSql.Provider.Dameng/DamengExpression.cs
@@ -18,6 +18,10 @@ namespace FreeSql.Dameng
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ if (arrOper.Type == typeof(byte[])) return $"lengthb({getExp(arrOper)})";
+ break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs b/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs
index c2f6a1e1..f52cc8e6 100644
--- a/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs
+++ b/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs
@@ -18,6 +18,10 @@ namespace FreeSql.Firebird
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ if (arrOper.Type == typeof(byte[])) return $"octet_length({getExp(arrOper)})";
+ break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs
index 13f2b195..1c174d31 100644
--- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs
+++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs
@@ -19,6 +19,12 @@ namespace FreeSql.KingbaseES
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ var arrOperExp = getExp(arrOper);
+ if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)";
+ if (arrOper.Type == typeof(byte[])) return $"octet_length({getExp(arrOper)})";
+ return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end";
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
@@ -45,10 +51,6 @@ namespace FreeSql.KingbaseES
}
}
break;
- case ExpressionType.ArrayLength:
- var arrOperExp = getExp((exp as UnaryExpression).Operand);
- if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)";
- return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end";
case ExpressionType.Call:
var callExp = exp as MethodCallExpression;
diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs
index 0de463bc..337bba13 100644
--- a/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs
+++ b/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs
@@ -19,6 +19,10 @@ namespace FreeSql.MsAccess
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ //case ExpressionType.ArrayLength:
+ // var arrOper = (exp as UnaryExpression)?.Operand;
+ // if (arrOper.Type == typeof(byte[])) return $"lenb({getExp(arrOper)})"; #505
+ // break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
diff --git a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs
index d54733b2..8f784c47 100644
--- a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs
+++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs
@@ -20,6 +20,10 @@ namespace FreeSql.MySql
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ if (arrOper.Type == typeof(byte[])) return $"octet_length({getExp(arrOper)})";
+ break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs
index f7a344e3..0c9c5f84 100644
--- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs
+++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs
@@ -18,6 +18,10 @@ namespace FreeSql.Odbc.Dameng
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ if (arrOper.Type == typeof(byte[])) return $"lengthb({getExp(arrOper)})";
+ break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs
index f819d74e..c9299d53 100644
--- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs
+++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs
@@ -19,6 +19,12 @@ namespace FreeSql.Odbc.KingbaseES
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ var arrOperExp = getExp(arrOper);
+ if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)";
+ if (arrOper.Type == typeof(byte[])) return $"octet_length({getExp(arrOper)})";
+ return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end";
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
@@ -45,10 +51,6 @@ namespace FreeSql.Odbc.KingbaseES
}
}
break;
- case ExpressionType.ArrayLength:
- var arrOperExp = getExp((exp as UnaryExpression).Operand);
- if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)";
- return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end";
case ExpressionType.Call:
var callExp = exp as MethodCallExpression;
diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs
index 0867c078..bbf238d4 100644
--- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs
+++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs
@@ -18,6 +18,10 @@ namespace FreeSql.Odbc.MySql
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ if (arrOper.Type == typeof(byte[])) return $"octet_length({getExp(arrOper)})";
+ break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs
index 7ee2af4a..f1adc650 100644
--- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs
+++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs
@@ -18,6 +18,10 @@ namespace FreeSql.Odbc.Oracle
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ if (arrOper.Type == typeof(byte[])) return $"dbms_lob.getlength({getExp(arrOper)})";
+ break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs
index d4fc852d..fb932479 100644
--- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs
+++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs
@@ -19,6 +19,12 @@ namespace FreeSql.Odbc.PostgreSQL
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ var arrOperExp = getExp(arrOper);
+ if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)";
+ if (arrOper.Type == typeof(byte[])) return $"octet_length({getExp(arrOper)})";
+ return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end";
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
@@ -45,10 +51,6 @@ namespace FreeSql.Odbc.PostgreSQL
}
}
break;
- case ExpressionType.ArrayLength:
- var arrOperExp = getExp((exp as UnaryExpression).Operand);
- if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)";
- return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end";
case ExpressionType.Call:
var callExp = exp as MethodCallExpression;
diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs
index 65e0779d..97703237 100644
--- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs
+++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs
@@ -18,6 +18,10 @@ namespace FreeSql.Odbc.SqlServer
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ if (arrOper.Type == typeof(byte[])) return $"datalength({getExp(arrOper)})";
+ break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
diff --git a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs
index 0d483ca3..d29a4041 100644
--- a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs
+++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs
@@ -18,6 +18,10 @@ namespace FreeSql.Oracle
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ if (arrOper.Type == typeof(byte[])) return $"dbms_lob.getlength({getExp(arrOper)})";
+ break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs
index f584472c..d2524cb4 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs
+++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs
@@ -20,6 +20,12 @@ namespace FreeSql.PostgreSQL
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ var arrOperExp = getExp(arrOper);
+ if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)";
+ if (arrOper.Type == typeof(byte[])) return $"octet_length({getExp(arrOper)})";
+ return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end";
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
@@ -46,10 +52,6 @@ namespace FreeSql.PostgreSQL
}
}
break;
- case ExpressionType.ArrayLength:
- var arrOperExp = getExp((exp as UnaryExpression).Operand);
- if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)";
- return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end";
case ExpressionType.Call:
var callExp = exp as MethodCallExpression;
diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs
index aedaa4eb..81fc8592 100644
--- a/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs
+++ b/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs
@@ -19,6 +19,12 @@ namespace FreeSql.ShenTong
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ var arrOperExp = getExp(arrOper);
+ if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)";
+ //if (arrOper.Type == typeof(byte[])) return $"octet_length({getExp(arrOper)})"; #505
+ return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end";
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
@@ -45,10 +51,6 @@ namespace FreeSql.ShenTong
}
}
break;
- case ExpressionType.ArrayLength:
- var arrOperExp = getExp((exp as UnaryExpression).Operand);
- if (arrOperExp.StartsWith("(") || arrOperExp.EndsWith(")")) return $"array_length(array[{arrOperExp.TrimStart('(').TrimEnd(')')}],1)";
- return $"case when {arrOperExp} is null then 0 else array_length({arrOperExp},1) end";
case ExpressionType.Call:
var callExp = exp as MethodCallExpression;
diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs
index 91ead6ed..ce8ddd09 100644
--- a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs
+++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs
@@ -18,6 +18,10 @@ namespace FreeSql.SqlServer
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ if (arrOper.Type == typeof(byte[])) return $"datalength({getExp(arrOper)})";
+ break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();
diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs
index fa3c394a..b6413643 100644
--- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs
+++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs
@@ -18,6 +18,10 @@ namespace FreeSql.Sqlite
Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType)
{
+ case ExpressionType.ArrayLength:
+ var arrOper = (exp as UnaryExpression)?.Operand;
+ if (arrOper.Type == typeof(byte[])) return $"length({getExp(arrOper)})";
+ break;
case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis();