- 增加 表达式树函数解析 byte[] Length;#505

This commit is contained in:
2881099 2020-10-31 07:03:00 +08:00
parent b86676df4e
commit 454eb8cc44
19 changed files with 369 additions and 20 deletions

View File

@ -24,6 +24,86 @@
支付Id 支付Id
</summary> </summary>
</member> </member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.ClassId">
<summary>
班期标识-BodyScheduleEntity班期主键
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.Name">
<summary>
姓名
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.Birthday">
<summary>
出生日期
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.IdCard">
<summary>
身份证
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.TelPhone">
<summary>
联系电话
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.SchoolName">
<summary>
学校名称
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.StuCCNL">
<summary>
初潮年龄
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.Address">
<summary>
联系地址
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.CheckUserId">
<summary>
审核人标识
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.CheckUserName">
<summary>
审核人
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.CheckTime">
<summary>
审核时间
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.RefuseReason">
<summary>
拒绝原因
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.CollectionDate">
<summary>
采集时间
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.AttachmentId">
<summary>
附件标识(多附件)
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.Sex">
<summary>
性别
</summary>
</member>
<member name="P:FreeSql.Tests.Issues._507.BodyAuditEntity.ClassInfo">
<summary>
班期信息
</summary>
</member>
<member name="M:FreeSql.Tests.MySql.MySqlCodeFirstTest.Tb_alltype.Save"> <member name="M:FreeSql.Tests.MySql.MySqlCodeFirstTest.Tb_alltype.Save">
<summary> <summary>
保存或添加,如果主键有值则尝试 Update如果影响的行为 0 则尝试 Insert 保存或添加,如果主键有值则尝试 Update如果影响的行为 0 则尝试 Insert

View File

@ -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<Model505>().Where("1=1").ExecuteAffrows();
fsql.Insert(new Model505 { ByteLength = byteArray.Length, ByteArray = byteArray }).ExecuteAffrows();
var item = fsql.Select<Model505>()
//.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; }
}
}
}

View File

@ -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<BodyAuditEntity>();
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; }
/// <summary>
/// 班期标识-BodyScheduleEntity班期主键
/// </summary>
[Column(Name = "ClassId", StringLength = 70, Position = 2)]
public string ClassId { get; set; }
/// <summary>
/// 姓名
/// </summary>
[Column(Name = "Name", StringLength = 20, Position = 3)]
public string Name { get; set; }
/// <summary>
/// 出生日期
/// </summary>
[Column(Name = "Birthday", StringLength = 20, Position = 5)]
public string Birthday { get; set; }
/// <summary>
/// 身份证
/// </summary>
[Column(Name = "IdCard", StringLength = 20, Position = 6)]
public string IdCard { get; set; }
/// <summary>
/// 联系电话
/// </summary>
[Column(Name = "TelPhone", StringLength = 15, Position = 7)]
public string TelPhone { get; set; }
/// <summary>
/// 学校名称
/// </summary>
[Column(Name = "SchoolName", StringLength = 50, Position = 8)]
public string SchoolName { get; set; }
/// <summary>
/// 初潮年龄
/// </summary>
[Column(Name = "StuCCNL", StringLength = 20, Position = 9)]
public int? StuCCNL { get; set; }
/// <summary>
/// 联系地址
/// </summary>
[Column(Name = "Address", StringLength = 100, Position = 10)]
public string Address { get; set; }
/// <summary>
/// 审核人标识
/// </summary>
[Column(Name = "CheckUserId", StringLength = 70)]
public string CheckUserId { get; set; }
/// <summary>
/// 审核人
/// </summary>
[Column(Name = "CheckUserName", StringLength = 20)]
public string CheckUserName { get; set; }
/// <summary>
/// 审核时间
/// </summary>
[Column(Name = "CheckTime")]
public DateTime? CheckTime { get; set; }
/// <summary>
/// 拒绝原因
/// </summary>
[Column(Name = "RefuseReason", StringLength = 100)]
public string RefuseReason { get; set; }
/// <summary>
/// 采集时间
/// </summary>
[Column(Name = "CollectionDate")]
public DateTime? CollectionDate { get; set; }
/// <summary>
/// 附件标识(多附件)
/// </summary>
[Column(Name = "AttachmentId", StringLength = 500)]
public string AttachmentId { get; set; }
/// <summary>
/// 性别
/// </summary>
[Column(Name = "Sex", StringLength = 2, Position = 4)]
public string Sex { get; set; }
#region
/// <summary>
/// 班期信息
/// </summary>
[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; }
}
}
}

View File

@ -18,6 +18,10 @@ namespace FreeSql.Dameng
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();

View File

@ -18,6 +18,10 @@ namespace FreeSql.Firebird
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();

View File

@ -19,6 +19,12 @@ namespace FreeSql.KingbaseES
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();
@ -45,10 +51,6 @@ namespace FreeSql.KingbaseES
} }
} }
break; 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: case ExpressionType.Call:
var callExp = exp as MethodCallExpression; var callExp = exp as MethodCallExpression;

View File

@ -19,6 +19,10 @@ namespace FreeSql.MsAccess
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();

View File

@ -20,6 +20,10 @@ namespace FreeSql.MySql
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();

View File

@ -18,6 +18,10 @@ namespace FreeSql.Odbc.Dameng
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();

View File

@ -19,6 +19,12 @@ namespace FreeSql.Odbc.KingbaseES
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();
@ -45,10 +51,6 @@ namespace FreeSql.Odbc.KingbaseES
} }
} }
break; 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: case ExpressionType.Call:
var callExp = exp as MethodCallExpression; var callExp = exp as MethodCallExpression;

View File

@ -18,6 +18,10 @@ namespace FreeSql.Odbc.MySql
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();

View File

@ -18,6 +18,10 @@ namespace FreeSql.Odbc.Oracle
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();

View File

@ -19,6 +19,12 @@ namespace FreeSql.Odbc.PostgreSQL
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();
@ -45,10 +51,6 @@ namespace FreeSql.Odbc.PostgreSQL
} }
} }
break; 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: case ExpressionType.Call:
var callExp = exp as MethodCallExpression; var callExp = exp as MethodCallExpression;

View File

@ -18,6 +18,10 @@ namespace FreeSql.Odbc.SqlServer
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();

View File

@ -18,6 +18,10 @@ namespace FreeSql.Oracle
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();

View File

@ -20,6 +20,12 @@ namespace FreeSql.PostgreSQL
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();
@ -46,10 +52,6 @@ namespace FreeSql.PostgreSQL
} }
} }
break; 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: case ExpressionType.Call:
var callExp = exp as MethodCallExpression; var callExp = exp as MethodCallExpression;

View File

@ -19,6 +19,12 @@ namespace FreeSql.ShenTong
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();
@ -45,10 +51,6 @@ namespace FreeSql.ShenTong
} }
} }
break; 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: case ExpressionType.Call:
var callExp = exp as MethodCallExpression; var callExp = exp as MethodCallExpression;

View File

@ -18,6 +18,10 @@ namespace FreeSql.SqlServer
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();

View File

@ -18,6 +18,10 @@ namespace FreeSql.Sqlite
Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc); Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
switch (exp.NodeType) 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: case ExpressionType.Convert:
var operandExp = (exp as UnaryExpression)?.Operand; var operandExp = (exp as UnaryExpression)?.Operand;
var gentype = exp.Type.NullableTypeOrThis(); var gentype = exp.Type.NullableTypeOrThis();